CS.BANNED.INVOKE
同期呼び出しよりも非同期呼び出しを優先します。
Windows.Forms.Control.Invoke synchronous メソッドを使用することを避けます。特に戻り値が必要ない場合は、Windows.Forms.Control.BeginInvoke 非同期メソッドの使用を検討してください。Invoke 同期メソッドは、追跡が非常に困難なデッドロックを引き起こす可能性があります。Windows.Forms.Control メソッドは、クロススレッドの Invoke/BeginInvoke メソッドを除いて、制御を作成した GUI スレッドでのみ使用できます。
同期 Invoke メソッドを使用している別のスレッドは、GUI スレッドで同期されているリソースをロックすると、デッドロックを引き起こす可能性があります。
この状況は、非同期の BeginInvoke 呼び出しにより回避できます。
軽減と防止
潜在的なデッドロックがある状況で、コードのレビューを実施します。
脆弱コード例
コピー
public class Class1
{
private TextBox _TextBox;
private void Update(string text)
{
_TextBox.Text = text;
}
public delegate void UpdateDelegate(string text);
void method1()
{
_TextBox.Invoke(new UpdateDelegate(this.Update), new string []{"info"}); // VIOLATION
}
}
修正コード例
コピー
public class Class1
{
private TextBox _TextBox;
private void Update(string text)
{
_TextBox.Text = text;
}
public delegate void UpdateDelegate(string text);
void method1()
{
_TextBox.BeginInvoke(new UpdateDelegate(this.Update)); // FIXED
}
}