如何检测.NET中的跨线程访问(强制线程关联)?

2023-12-28

我正在编写一种特殊的数据结构,该数据结构将在 .NET 库中可用,该数据结构的特点之一是,如果只有一个线程向其写入数据,并且只有一个线程从中读取数据,那么它将是线程安全的它(读取器线程和写入器线程可以不同)。

问题是如何强制所有读取操作都由同一线程执行?

我的解决方案是捕获 System.Threading.Thread.ManagedThreadID 并在第一次读取时将其存储在私有成员中。然后,在后续读取时对照已保存的 ManagedThreadID 检查 ManagedThreadID,如果不同则引发异常。

这是否足够,或者是否有其他更可靠的机制可以做到这一点?

注意:要求该库可以在没有 Windows.Forms 上下文的情况下使用。


当我遇到这种情况时,我使用了我编写的一个名为 ThreadAffinity 的类。它的全部目的是记录当前线程并抛出来自不同线程的无效访问。您必须手动进行检查,但它为您封装了少量工作。

class Foo {
  ThreadAffinity affinity = new ThreadAffinity();

  public string SomeProperty {
    get { affinity.Check(); return "Somevalue"; }
  }
}

Class

[Immutable]
public sealed class ThreadAffinity
{
    private readonly int m_threadId;

    public ThreadAffinity()
    {
        m_threadId = Thread.CurrentThread.ManagedThreadId;
    }

    public void Check()
    {
        if (Thread.CurrentThread.ManagedThreadId != m_threadId)
        {
            var msg = String.Format(
                "Call to class with affinity to thread {0} detected from thread {1}.",
                m_threadId,
                Thread.CurrentThread.ManagedThreadId);
            throw new InvalidOperationException(msg);
        }
    }
}

关于该主题的博客文章:

  • http://blogs.msdn.com/jaredpar/archive/2008/02/22/thread-affinity.aspx http://blogs.msdn.com/jaredpar/archive/2008/02/22/thread-affinity.aspx
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何检测.NET中的跨线程访问(强制线程关联)? 的相关文章

  • .NET Compact Framework 应用程序中的版本号

    我需要在屏幕上显示 NET Compact Framework 版本号 我将 NET CF 2 0 与 Windows CE 4 0 结合使用 到目前为止 我完全忽略了版本号 我需要向程序集中添加任何内容吗 我如何以编程方式检索它 不幸的是
  • Directory.CreateDirectory 延迟问题?

    我正在尝试创建一个远程目录 然后向其中写入一个文件 每隔一段时间 应用程序就会在尝试写入文件时失败并出现 System IO DirectoryNotFoundException 当我写入文件时 我使用返回的 DirectoryInfo 对
  • ComboBox 内容的自动宽度

    有谁知道如何设置ComboBox内容的宽度自动调整大小 我的意思不是ComboBox本身 只是打开的内容 你不能直接使用它 做一招 首先遍历组合框的所有项目 通过将文本分配给标签来检查每个项目的宽度 然后 每次检查宽度 如果当前项目的宽度大
  • Windows 窗体中的切换开关控件

    我正在设计一个拨动开关控制使用CheckBox 但目前我的控件只能画一个圆圈 如何绘制如下图所示的圆形形状 以及如何根据控件的值更改圆圈的位置以表示选中和未选中的状态 如下图所示 这是我的代码 public class MyCheckBox
  • JavaFX 多线程 - 连接线程不会更新 UI

    我正在尝试创建一个加载程序对话框 用户可以在其中知道程序正在加载所请求的内容并且程序正在按预期运行 但正因为如此 我需要join 解析器线程和之前继续主线程 这使得对话框空白 解析器任务 java public class ParserTa
  • 在 TPL Dataflow 中,是否可以在创建块之后但使用之前更改 DataflowBlockOptions?

    有效果吗 我想推迟设置 ExecutionDataflowBlockOptions SingleProducerConstrained 属性 直到我准备好将网络链接在一起 因为 我想将创建块及其语义与将网络及其语义链接在一起分开 但据我所知
  • Image.FromStream() 方法返回 Invalid Argument 异常

    我正在从智能相机成像器捕获图像 并通过套接字编程从相机接收字节数组 NET 应用程序是客户端 相机是服务器 问题是我在运行时收到 System InvalidArgument 异常 private Image byteArrayToImag
  • 信号量如何工作?

    信号量可以小于0吗 我的意思是 假设我有一个 N 3 的信号量 并且我调用 down 4 次 那么 N 将保持为 0 但一个进程将被阻塞 反之亦然 如果一开始我调用 N 可以大于 3 吗 因为在我看来 如果 N 可以高于 3 如果一开始我调
  • 如何将本机 C 类型与 PerformSelectorOnMainThread: 一起使用?

    我想打电话 void setDoubleValue double value using performSelectorOnMainThread 我认为可行的是 NSNumber progress NSNumber numberWithDo
  • 如何使用线程在 C# 中依次运行 3 个方法?

    我有三种方法 即方法1 方法2和方法3 方法1用于从一个站点下载图像 方法2用于从第二个站点下载图像 方法3用于比较图像 Method1 获取根据产品 id 逐一添加到列表中的图像 url 列表 即多个产品 id 的集合上有一个循环 然后根
  • VS2008 针对 .NET 2.0 并没有阻止我使用 C# 3 功能

    我有一个 VS2005 解决方案 并且想在新的一年中摆脱 VS2005 我对升级过程非常满意 并且惊喜地发现我的构建脚本大部分仍然有效 我的问题是围绕多目标功能 我的服务器上没有安装 NET 3 5 因此我必须继续以 NET 2 0 为目标
  • Pthreads - 高内存使用率

    我正在用 C 编写一些东西 在 256Mb 系统上的 Linux 中创建大量 Pthread 我通常有 200Mb 的免费空间 当我使用少量线程运行该程序时 它可以工作 但是一旦我让它创建大约 100 个线程 它就会出现错误 因为系统内存不
  • new Task 总是在 ThreadPool 线程上执行吗?

    这可能是一个简单而愚蠢的问题 我创建一个这样的任务 Task
  • 当ConfigureAwait(false)导致错误而不是死锁时的情况

    假设我写了一个依赖于async方法 namespace MyLibrary1 public class ClassFromMyLibrary1 public async Task
  • 使用更新的值重新加载实体框架上下文中的对象

    我有一个从数据库中提取的 EF 对象 然后 我通过使用另一个函数调用来更新数据库中的相应行DBContext 在此更新之后 我想使用更新后的内容重新加载对象的内容 但是 EF 上下文似乎缓存了这些内容 这是代码示例 我删除了一些不相关的内容
  • .NET 中可以使用通用 BitConverter.GetBytes 吗?

    是否可以创建类似的方法BitConverter GetBytes 也接受作为输入范围类型的Object 不使用编组处理here https stackoverflow com questions 1455581 generic bitcon
  • Android Thread、AsyncTask 与从 BLE onCharacteristicChanged() 调用的 IntentService

    我有一个 Android 应用程序 我从中接收 BLE 数据 每 62 毫秒通过通知 该应用程序可以通过 BufferedWriter 将数据保存到文件中 在每次 onCharacteristicChanged 回调时 如果用户启用了文件保
  • 在 C# .net 中如何使用 RSA 和许可证提供程序类进行许可?

    我想为简单的控制台应用程序提供许可证 我使用 RSACrypttoServiceProvider 类来加密和解密 我还想使用 LicFileLicenseProvider 类来为我的应用程序授予许可证 如何继承LicFileLicenseP
  • 使用“NOT IN”的 LINQ to SQL 查询

    可以使用 LINQ to SQL 查询NOT IN 例如 SELECT au lname 声明 FROM 作者 WHERE 声明 NOT IN CA IN MD List
  • 无法在 .NET 中加载 Oracle.DataAccess 的文件或程序集

    当我尝试运行一个简单的程序来访问 oracle 时 我收到此消息 无法加载文件或程序集 Oracle DataAccess 版本 2 111 7 20 文化 中性 PublicKeyToken 89b483f429c47342 或其依赖项之

随机推荐

  • Pandas 根据字符串比较有条件地替换数据框中的值

    我有一个 Pandas 数据框 如下所示 有 3 列 我想比较每一列以查看该值是否与特定字符串匹配 如果是 则将该值替换为 NaN 例如 如果数据框的第 1 列中有 5 个值 abcd abcd defg abcd defg 如果比较字符串
  • 如何更改点击时的图像和 alt 属性?

    我希望使用 JQuery 而不是普通的 JavaScript 来更改几个图像 onclick 并同时更改图像 alt 属性以实现可访问性 这应该很容易 因为我不希望对变化做一些特殊的效果 但我仍然没有找到任何关于它的东西 这是我使用 JS
  • 如何循环遍历 pandas df 列,查找字符串是否包含来自单独 pandas df 列的任何字符串?

    我有两个 python 中的 pandas DataFrame DDF A 包含一列 它基本上是句子长度的字符串 sentenceCol other column this is from france 15 DF B 包含一列 该列是国家
  • 获取黑白 UIImage(非灰度)

    我需要从另一个 UIImage 不是灰度 获取纯黑白 UIImage 有人可以帮助我吗 谢谢阅读 EDITED 这是建议的解决方案 谢谢大家 我几乎知道这不是更好的方法 但效果很好 Gets an pure black and white
  • Java 和 Spring。事务注释@Transactional

    我想从 DAO 类中删除开始和提交事务 并且我需要使用事务注释 应该怎么做呢 现在 例外是 org hibernate HibernateException createQuery 在没有活动事务的情况下无效 课程DAO java publ
  • Reacts/Flux 的存储应该是 GUI 整个状态的快照吗?

    简短的问题 看起来应用程序的状态可以从 React Flux 存储中完全序列化 我已经在输入值和其他内容中看到过这种情况 但是动画或悬停效果又是什么呢 我应该使用经典吗 hover用于悬停效果的 CSS 选择器 还是应该使用 mouseen
  • db4o 客户端/服务器似乎一次只能处理一个查询?

    我们正在评估 db4o 来自http www db4o com http www db4o com 我们针对客户端 服务器模式进行了性能测试 其中我们启动服务器 然后同时使用多个客户端对其进行测试 看起来服务器一次只能处理一个客户端的查询
  • Spark 节点在 Shuffle 期间如何通信?

    我见过从这个问题 https stackoverflow com questions 38084293 spark how does it distribute data around the nodesSpark 节点有效地 直接通信 但
  • 在 MySQL 中使用列组作为唯一键

    我有一张桌子叫requests列所在的位置id placeId songId userId id是表的主索引 其余列只是无符号整数 并且没有定义其他唯一键 I want placeId songId对是唯一的 即 如果一行有placeId
  • 带条件的累积平均值

    我的 df 的小代表 PTS TeamHome lt c 101 87 94 110 95 PTS TeamAway lt c 95 89 105 111 121 TeamHome lt c LAL HOU SAS MIA LAL Team
  • Android:当电池处于定义的水平时执行某些操作

    我在这里遇到了一个小问题 我希望我的应用程序执行某些操作 但仅限于电池电量为 10 时 我的应用程序不会持续监视电池电量 它只是等待 LOW BATTERY 意图 如果我不指定级别 它会起作用 但它会起作用 3 次 15 10 和 5 我只
  • cap部署symfony2项目时出现问题,找不到app/bootstrap.php.cache

    我正在尝试 第一次 使用 capifony 从我的 github 存储库部署我的网站 它一直运行到设置阶段并出现以下错误 out example me PHP Warning require once var www example pro
  • Google Chrome 中选项页面和后台页面之间的通信

    我正在尝试一个简单的 Google Chrome 扩展 其中我需要在选项页面和后台页面之间进行通信以获取 设置选项 我尝试过 chrome extension sendRequest 和 chrome extension onRequest
  • Rails Engine:如何根据每个请求自动重新加载类?

    我正在开发一个 Rails 引擎 它允许实现者将类放入app snippets 从引擎内部 我想指示主机 Rails 应用程序自动重新加载类app snippets根据每个请求 以便实施者在进行更改时不必重新启动服务器 我明白有一个conf
  • 使用 elm 并选择

    我尝试通过自定义示例来了解 elm 的工作原理 durationOption duration option value toString duration text toString duration view Model gt Html
  • 字符串到 HtmlDocument

    我使用 URL 通过 URL 获取 html 文档WebClient DownloadString url 但很难找到我正在寻找的元素内容 在阅读周围我发现HtmlDocument它有一些巧妙的东西 例如GetElementById 我怎样
  • Python 和 Apache mod_wsgi 中的全局变量

    我知道存在框架 但我尝试直接使用 wsgi 来提高我自己的理解 我有我的 wsgi 处理程序 在顶部我声明了一个变量i 0 In my application environ start response 函数 我声明global i 然后
  • 使用 Parse.com 中的云代码自动更新数据

    我正在寻找一种使用云代码自动更新数据的方法 假设我有课Table 在它里面 我有三列 firstname lastname and fullname 目前 我只有firstname and lastname仅数据 柱子fullname仍然是
  • XmlSerializer。跳过xml未知节点

    我的 xml 文件反序列化时遇到问题 让我们假设 我们有一个 xml 文件和一个用于反序列化的类 例如 xml
  • 如何检测.NET中的跨线程访问(强制线程关联)?

    我正在编写一种特殊的数据结构 该数据结构将在 NET 库中可用 该数据结构的特点之一是 如果只有一个线程向其写入数据 并且只有一个线程从中读取数据 那么它将是线程安全的它 读取器线程和写入器线程可以不同 问题是如何强制所有读取操作都由同一线