gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 03:25:08 24 4
gpt4 key购买 nike

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

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

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

这就足够了,还是有其他更可靠的机制来做到这一点。

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

最佳答案

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

class Foo {
ThreadAffinity affinity = new ThreadAffinity();

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

类别

[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);
}
}
}

有关该主题的博客文章:

关于.net - 如何检测.NET中的跨线程访问(强制线程关联)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/922219/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com