IsInvokeRequired有多贵

leo*_*ora 2 c# multithreading

有没有关于它究竟有多昂贵的文件:

if (x.IsInvokeRequired)
{
    beginInvoke . . . .
}
Run Code Online (Sandbox Code Playgroud)
  • 如果你有一个90%的时间都在后台线程上(因此需要)的情况值得吗?
  • 如果您有一个案例,其中90%的时间是在UI线程上(因此不是必需的)是否值得?

围绕这个的任何指标都会很棒.

Jar*_*Par 5

真正的答案:

使用分析器

模糊答案:

我认为您需要考虑两个函数的相对成本与InvokeRequired的绝对成本.

InvokeRequired for Control基本上将当前的ThreadId与预期的ThreadId进行比较.如果你看反射器,代码会稍微复杂一点,但实际上它就是它正在做的事情.这是相当便宜的,因为它只是一些函数调用和比较.

BeginInvoke涉及获取多个锁,将委托添加到调用队列,并可能在线程之间添加元帅.相对于实际的InvokeRequired调用,此代码要昂贵得多(可能是一个数量级或2).你需要更多的调用,其中InvokeRequired返回true,然后你才会看到任何增益直接进入BeignInvoke.