如何检查特定线程上是否正在调用函数?

TK.*_*TK. 0 c# multithreading

如果我有线程A,它是主要的应用程序线程和辅助线程.如何检查线程B中是否正在调用函数?

基本上我正在尝试实现以下代码snippit:

public void ensureRunningOnCorrectThread()
{
    if( function is being called within ThreadB )
    {
         performIO()
    }
    else
    {
         // call performIO so that it is called (invoked?) on ThreadB
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法在C#中执行此功能,还是有更好的方法来查看问题?

编辑1

我已经注意到MSDN文档中的以下内容,虽然我不知道它是否是一件好事!:

// if function is being called within ThreadB
if( System.Threading.Thread.CurrentThread.Equals(ThreadB) )
{

}
Run Code Online (Sandbox Code Playgroud)

编辑2

我意识到我以错误的方式看待这个问题(感谢下面的答案帮助我看到了这一点)我所关心的是在ThreadA上不会发生IO.这意味着它可能发生在ThreadB或任何其他线程上,例如BackgroundWorker.我已经决定在上面的f语句的else部分中创建一个新的BackgroundWorker,以确保以非阻塞的方式执行IO.我不完全确定这是我的问题的最佳解决方案,但它似乎工作!

Jus*_*ant 5

这是一种方法:

if (System.Threading.Thread.CurrentThread.ManagedThreadId == ThreadB.ManagedThreadId) 
            ...
Run Code Online (Sandbox Code Playgroud)

我对.NET的Thread类实现Equals()知之甚少,不知道上面的比较是否相同,但是如果没有这方面的知识,比较ID是一个安全的选择.

可能有一个更好的(更好的=更容易,更快等等)方式来完成你想要做的事情,取决于一些事情,如:

  • 你正在构建什么样的应用程序(ASP.NET,WinForms,控制台等)?
  • 为什么要只在一个线程上强制执行I/O?
  • 这是什么类型的I/O?(例如写入一个文件?网络I/O约束到一个插槽?等等)
  • 相对于锁定成本,并发工作线程数等,您的性能限制是什么?
  • 代码中的"else"子句是否需要阻塞,即发即弃,或者更复杂的东西
  • 你想如何处理超时,死锁等

将此信息添加到您的问题中会很有帮助,但如果您的是WinForms应用程序并且您正在谈论面向用户的GUI I/O,则可以跳过其他问题,因为该方案很明显.

请记住,// call performIO so that it is called (invoked?) on ThreadB实现将根据WinForms,ASP.NET,控制台等而有所不同.

如果是WinForms,请查看此CodeProject帖子以获得处理它的酷炫方法.另请参阅MSDN,了解如何使用InvokeRequired处理此操作.

如果是Console或通用服务器应用程序(没有GUI),您需要弄清楚如何让主线程知道它有等待工作 - 您可能想要考虑具有I/O工作线程的备用实现或线程池,它只是围绕执行排队到它的排队I/O请求.或者您可能想要考虑同步您的I/O请求(更容易),而不是将调用调用到一个线程(更难).

如果是ASP.NET,你可能会以错误的方式实现它.使用ASP.NET异步页面和/或(按上述方式)使用lock{}或使用其他同步方法同步对I/O进行同步通常更有效.