C#编译时间方式以确保方法仅在UI线程上调用,而其他方法仅在后台(非ui)线程中调用

Elo*_*off 5 c# multithreading attributes

现在我做:

Util.AssertBackgroundThread();

要么

Util.AssertUIThread();

在方法的开头.这不是太糟糕,但它是运行时错误检查.我们使用像C#这样的静态语言的原因是为了将更多的错误检查移到编译器的肩膀上.

现在我认为这通常不容易,但是如果我将自己限制为仅从我自己的实用程序方法启动线程(或使用ThreadPool.QueueUserWorkItem),那么在我看来,如果我标记这些方法,它应该是可能的进行静态分析以验证仅在UI线程上运行的方法确实只在UI线程上运行?

所以这里有两个问题.

  1. 我是对的,可以在编译时检查这个吗?
  2. 在Visual Studio 2008中是否有任何实用的方法(安装了最新的ReSharper)

Spe*_*nce 5

我一直很喜欢这种模式:

public void GuiMethod(object param)
{
   if(this.InvokeRequired)
   {
      this.Invoke(delgateToGuiMethod, params,...)
   }
   else
   {
      //perform gui thread method
   }
}
Run Code Online (Sandbox Code Playgroud)

您受到惩罚以调用和检查,但您可以保证该方法在gui线程上运行,或者将使用此模式调用gui线程.