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
     }
 }