2012-03-13 5 views
0

私はC#を初めて使っています。私はbegininvokeやeventhandlerのようなスレッドについて読んでいます。次のコードがrichtextboxで何をしているのか説明できますか?richtextの意味box.invoke

private void Log(LogMsgType msgtype, string msg) 
{ 
    rtfTerminal.Invoke(new EventHandler(delegate 
    { 
    rtfTerminal.SelectedText = string.Empty; 
    rtfTerminal.SelectionFont = new Font(rtfTerminal.SelectionFont, FontStyle.Bold); 
    rtfTerminal.SelectionColor = LogMsgTypeColor[(int)msgtype]; 
    rtfTerminal.AppendText(msg); 
    rtfTerminal.ScrollToCaret(); 
    })); 
} 

*これはbegininvokeと同じですか? *はmsdnで、次のように記述します。コントロールの基になるウィンドウハンドルを所有するスレッドで、指定されたデリゲートを実行します。

+0

Logメソッドがフォームと異なるスレッドにあります。それで、寛解を経て、それはGUIコントロールに到達しようとしています。あなたは見直しを読むべきです。 Reflexionは、メソッドが直接「認識」していないものに到達しようとしています。 – Mathieu

答えて

3

richtextboxで次のコードが何をしているのか説明できますか?

UIスレッドの匿名メソッドでコードを実行します。

これはbegininvokeと同じですか?

はい、ただしInvokeは同期ですが、BeginInvokeは非同期です。言い換えれば、Invokeの呼び出しは、UIスレッドがアクションを実行するのを待つことなく、BeginInvokeが直ちに戻りますが、UIスレッドが指定されたアクションを実行するまでブロックします。 MSDNで

ことの意味についてhandle.Notかなり確実コントロールの基になるウィンドウを所有するスレッド上で、指定したデリゲートを実行して、それを記述します。

Windowsフォームでは、コントロールは作成したスレッドでのみアクセスできます。したがって、別のスレッドで何かを実行していて、このスレッドからコントロール上でアクションを実行すると、直接行うことはできません。この操作を実行するには、UIスレッドに依頼する必要があります。それはInvokeBeginInvokeが対象です。

+0

ありがとうございました。あなたは私の問題をもう一度解決しました。別の質問です。新しいEventHandler(デリゲート{})をどうやって読んだり理解したらいいですか?なぜここでキーワードデリゲートを使用するのですか?私のために、ここでは何らかのパラメータよりもむしろ関数を指していないようです。 – fiftyplus

+0

このコンテキストでは、[delegate]キーワードを使用して[匿名メソッド](http://msdn.microsoft.com/en-us/library/0yw3tz5k.aspx)を作成します。 –