ホームページ  >  記事  >  バックエンド開発  >  C# InvokeとBeginInvokeの違いを詳しく解説

C# InvokeとBeginInvokeの違いを詳しく解説

零下一度
零下一度オリジナル
2017-06-28 15:38:211925ブラウズ

BeginInvoke メソッドは本当に非同期呼び出し用の新しいスレッドを開きますか?

次のコードを参照してください:

public delegate void Treeinvoke();private void UpdateTreeView()
{
MessageBox.Show(System.Threading.Thread.CurrentThread.Name);
}private void button1_Click(object sender, System .EventArgs e)
{
System.Threading.Thread.CurrentThread.Name = "UIThread";
treeView1.BeginInvoke(newtreeinvoke(UpdateTreeView));
}

実行結果を確認します。ポップアップ ダイアログ ボックス。は、 UIThread を示しています。これは、BeginInvoke によって呼び出されるデリゲートが基本的に UI スレッドで実行されることを示しています。

UIスレッドで実行されるのに、どうして「非同期実行」と言えるのでしょうか?

もう一度次のコードを見てみましょう:

public delegate void Treeinvoke();private void UpdateTreeView()
{
MessageBox.Show(Thread.CurrentThread.Name);
}private void button1_Click(object sender, System.EventArgs e)
{
Thread.CurrentThread.Name = "UIThread";
Thread th = new Thread(new ThreadStart(StartThread));
th.Start();
}private void StartThread()
{
Thread.CurrentThread. Name = "Work Thread";
treeView1.BeginInvoke(newtreeinvoke(UpdateTreeView));
}

もう一度実行結果を見てください。ポップアップ ダイアログ ボックスにはまだ UIThread が表示されています。これは何を意味しますか?これは、BeginInvoke メソッドによって呼び出されたデリゲートがいずれにしても UI スレッドで実行されることを示しています。

それでは、BeginInvoke の用途は何でしょうか?

マルチスレッド プログラミングでは、作業スレッドでインターフェイスの表示を更新する必要があることがよくありますが、マルチスレッドでインターフェイス コントロールを直接呼び出すのは間違っています。この記事を読んだ後に具体的な理由を読むことができます。マルチスレッドで Winform を呼び出す方法。専門家の方はこの記事を読まないでください。とにかく、私はその記事をよく理解できませんでした。

Invoke と BeginInvoke はこの問題を解決するようで、マルチスレッドでインターフェイスの表示を安全に更新できるようになります。

正しいアプローチは、ワーカー スレッドのインターフェイスの更新に関連するコードをメソッドにカプセル化し、Invoke または BeginInvoke を通じて呼び出すことです。この 2 つの違いは、1 つはワーカー スレッドを待機させること、もう 1 つは待機させることです。ない。

いわゆる「操作への応答とノードの追加を同時に行う」は相対的なものでしかないため、インターフェイスの正しい更新は常に行われなければならないため、UI スレッドの負担が大きくなりすぎることはありません。 UI スレッドを介して実行する必要があること ワーカー スレッドの計算の大部分を引き継ぎ、純粋なインターフェイスの更新を UI スレッドに反映することで、UI スレッドの負担を軽減するという目的を達成します。

ツリー ノードを更新するコードで、実際に動作する唯一のコードは System.Threading.Thread.Sleep(100); であり、これは UI スレッドにインターフェイス メッセージを処理する機会を与えます。次のコードが正常に動作する限り、問題は複雑です。

private void button1_Click_(object sender, System.EventArgs e)
{
TreeNode tn; for(int i=0;i {
tn=new TreeNode (i.ToString()); TreeView1.Nodes[0].Nodes.Add(tn); if (i%100 == 0) Application.DoEvents();
}
}

以上がC# InvokeとBeginInvokeの違いを詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。