コントロールは 2 つのワーカー スレッドによってアクセスされます。最初のスレッドがコントロールでの作業を完了する前に 2 番目のスレッドがアクセスされます。2 番目のスレッド (9) は InvokeRequired == false を取得し、最初のスレッド (17) は子コントロールで .Refresh を呼び出すときに例外を取得します。
これは予想される動作ですか?スレッドがコントロールの InvokeRequired を true/false と見なす正確な原因は何ですか?
そして最後に、良い解決策は何でしょうか..すべてのinvokeステートメントをロックし、代わりに別のメソッドを呼び出すようにします(明らかにデッドロックを回避するため)?
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