C# 实现跨线程调用检查
我需要检查是否从实例化该类的同一线程调用了一个方法,该类与WinForms控件实现的功能类似 如何才能做到这一点?下面的例子有效吗C# 实现跨线程调用检查,c#,multithreading,C#,Multithreading,我需要检查是否从实例化该类的同一线程调用了一个方法,该类与WinForms控件实现的功能类似 如何才能做到这一点?下面的例子有效吗 public class Foo { int ManagedThreadId; public Foo() { ManagedThreadId=Thread.CurrentThread.ManagedThreadId; } public void FooMethod() { if (ManagedThreadId!=Thre
public class Foo
{
int ManagedThreadId;
public Foo()
{
ManagedThreadId=Thread.CurrentThread.ManagedThreadId;
}
public void FooMethod()
{
if (ManagedThreadId!=Thread.CurrentThread.ManagedThreadId)
throw new InvalidOperationException("Foo accessed from a thread other than the thread it was created on.");
//Method code here.
}
}
我不确定存储ManagedThreadId是否足以实现这一点。
如果我存储了对线程的引用,这会给GC或其他东西带来问题吗?对于此任务,
ManagedThreadId
应该可以,但线程的文档声明它不会随时间而变化
在查看了WPF窗口的引用源之后,我认为还可以保留对实例化类的线程的引用,因为:存储调度程序,该调度程序反过来保留对其线程的引用,该线程看起来很正常-ManagedThreadId
不会随时间变化(),因此,您应该很好。如果调度程序
实现了这一点,那么存储对线程的引用
,而不仅仅是ManagedThreadId
,我认为以同样的方式做会更好。Thanks@SalvatoreSorbello我怀疑这是因为存储ID会留下创建对象的线程被破坏的可能性随后的一个线程被赋予相同的ID。这是极不可能的,但我认为,在一个创建和销毁大量线程的长时间运行的应用程序中是可能的。