一个控件由两个工作线程访问,第二个工作线程在第一个工作线程完成它对控件的工作之前。第二个线程 (9) 获取 InvokeRequired == false,然后第一个线程 (17) 在子控件上调用 .Refresh 时获取异常。
这是预期的行为吗?究竟是什么导致线程将控件的 InvokeRequired 视为真/假?
最后,什么是一个好的解决方案。在所有调用语句上加一个锁,并让它们调用一个单独的方法(显然是为了避免死锁)?
private void OnHistoryUpdate(object sender)
{
Console.WriteLine("<< Invoke? " + this.InvokeRequired + " " + Thread.CurrentThread.ManagedThreadId );
if (this.InvokeRequired)
this.Invoke(new Action<object>(OnHistoryUpdate), sender);
LoadTimeSeries(this.Interval);
Console.WriteLine(">> Invoke? " + this.InvokeRequired + " " + Thread.CurrentThread.ManagedThreadId);
}
输出:
<< Invoke? True Thread: 17
<< Invoke? False Thread: 9
>> Invoke? False Thread: 9