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

Mik*_*scu 7 .net multithreading

我正在编写一个特殊的数据结构,它将在.NET库中可用,并且该数据结构的一个特性是线程安全的,前提是只有一个线程向其写入数据,并且只有一个线程从中读取数据它(读者线程和作者线程可以不同).

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

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

这还不够,或者是否有一种不同的更可靠的机制来做到这一点.

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

Jar*_*Par 6

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

class Foo {
  ThreadAffinity affinity = new ThreadAffinity();

  public string SomeProperty {
    get { affinity.Check(); return "Somevalue"; }
  }
}
Run Code Online (Sandbox Code Playgroud)

[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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

关于这个主题的博客文章: