如果我有线程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.我不完全确定这是我的问题的最佳解决方案,但它似乎工作!
这是一种方法:
if (System.Threading.Thread.CurrentThread.ManagedThreadId == ThreadB.ManagedThreadId)
...
Run Code Online (Sandbox Code Playgroud)
我对.NET的Thread类实现Equals()知之甚少,不知道上面的比较是否相同,但是如果没有这方面的知识,比较ID是一个安全的选择.
可能有一个更好的(更好的=更容易,更快等等)方式来完成你想要做的事情,取决于一些事情,如:
将此信息添加到您的问题中会很有帮助,但如果您的是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进行同步通常更有效.