0

したがって、Invokeプロパティに関してこれまでにオンラインで見つけたドキュメントは、特に良いとは思えません。これは、信じられないかもしれませんが、実際にはちょっと面倒です。Invokeの機能を理解しています。GUIに直接安全にアクセスすることはできないため、invokeは安全な方法でアクセスします。それは問題ありませんが、メソッドに含まれる変数がわかりません。たとえば、リストボックスからテキストを削除したい場合、どうすればよいですか?私は少し道に迷う前にこれについてずっと理解しています。

private void DoStuff(string TextIWouldBeRemoving)
{        

if (listboxname.InvokeRequired)
    {
        listboxname.Invoke(SomeMysteriousParamaters, new object[] { TextIWouldBeRemoving )};   
    }
}
4

3 に答える 3

0

最初のパラメーターは安全に呼び出すメソッドであり、2番目のパラメーターはそのメソッドの引数のオブジェクト配列です。

だからあなたは書くでしょう:

private void DoStuff(string TextIWouldBeRemoving)
{        
    if (listboxname.InvokeRequired)
    {
        listboxname.Invoke(DoStuff, new object[] { TextIWouldBeRemoving )};   
    }
    else
    {
        // Actually remove the text here!
    }
}
于 2011-09-07T14:02:35.923 に答える
0

Invoke はすべてスレッドに関するものです。

コード内に別のスレッドを作成したときはいつでも呼び出しを行う必要があり、その新しく作成されたスレッドで実行されているコード内からユーザー インターフェイス要素を更新する必要があります。

同期 Invoke メソッドの代わりに、BeginInvoke を使用できます。この記事には良い例があります:

http://msdn.microsoft.com/en-us/library/0b1bf3y3.aspx

于 2011-09-07T14:04:23.433 に答える
0
  private void button1_Click(object sender, EventArgs e)
  {
     if (listBox1.InvokeRequired)
     {
        Action<string> d = DoAnything;
        listBox1.Invoke(d, new object[] { "Item 1" });
     }
     else
        DoAnything("Item 1");
  }

  void DoAnything(string itemText)
  {
     listBox1.Items.Remove(itemText);
  }
于 2011-09-07T14:09:18.193 に答える