2012-04-07 4 views
0

私は最近、サーバー用のコンソールラッパーのソースコードを取得しました。プログラムは、WPFにもともといたし、コードの一部は:WPFディスパッチャをWinforms BGworkerに変換しますか?

private void ServerProc_ErrorDataReceived(object sender, DataReceivedEventArgs e) 
    { 
     Dispatcher.Invoke(new Action(() => 
     { 
      ConsoleTextBlock.Text += e.Data + "\r\n"; 
      ConsoleScroll.ScrollToEnd(); 
     })); 
    } 
    private void ServerProc_OutputDataReceived(object sender, DataReceivedEventArgs e) 
    { 
     Dispatcher.Invoke(new Action(() => 
     { 
      ConsoleTextBlock.Text += e.Data + "\r\n"; 
      ConsoleScroll.ScrollToEnd(); 
      ParseServerInput(e.Data); 
     })); 
    } 

そのまた、両方の空隙にこの注釈を持っていた:

//このメソッドは あるので、あなたは、ディスパッチャを介してこれをしなければなりません別のスレッドで呼び出される

しかし、WinFormsでは、このようなことはありません - これをバックグラウンドワーカーまたは何かに変更する方法はありますか(ほとんどすべてのマルチスレッドを実行しています)?

誰が助けることができれば、それは素晴らしいこと!

ありがとうございました。

答えて

1

どちらの方法でも、イベントハンドラです。彼らは何らかの種類のリスニングコードから来ている可能性があり、非UIスレッド(通常はリスニングを行っているスレッドプールスレッドなど)から呼び出されることが予想されます。ブレークポイントを設定し、デバッガのスレッドウィンドウを見て確認できます。
したがって、非UIスレッドからUIを更新するwinformsの方法を適用する必要があります。
あなたがそうすれば、あなたはそれを行う方法にかなりたくさんあるはずです。例えば
Updating UI from a different thread
How to update GUI from another thread in C#?

+0

おかげで、私は私のコードにこれを適用する方法イムあまりわからない - イムはるかに良いVB.NETで、まだC# –

0

いくつかの背景:UIスレッド以外のスレッドで実行されているプロセスを直接任意のUIコントロールにアクセスすることを許可されていません。あなたのWPF ServerProcはUIとは別のスレッドで実行されており、ServerProcスレッドからUIスレッドのUIコントロールに戻るのに役立つように、Dispatcherが必要です。

ServerProc-in WPFまたはWinFormsがUIスレッドで実行されていた場合は、Dispatcher.Invoke呼び出しで囲む必要はありません。

はあなたのために、あなたはBackgroundWorker (MSDN example)であなたのServerProcを置くことができます。あなたのDoWork方法は仕事をしているコードの肉を含んでいるでしょうし、その後ServerProcはその作業を行う方法に応じて、あなたは両方のあなたのサンプルWPFのメソッドが何をしているかを行うためにProgressChangedを使用することができるかもしれません。 ProgressChangedには、それがエラーであるかデータが受信されたかを示し、関数内に適切な情報を表示できるというパラメータが渡されます。良い例があるので、MSDNのドキュメントを見てください。

重要なことは、ProgressChangedがUIスレッド上で発生するため、InvokeでUIコントロールへの呼び出しを囲む必要がないことです。単にそれらを普通に呼んでください。 RunWorkerCompletedも同じです。これは、ServerProcがジョブを終了したときにデータを表示するためのもう1つのオプションです。あなたが実際にあなたのスレッドの中からUIコントロールにアクセスしなければならない場合

は最後に、あなたはあなたのWPFのコードサンプルのように見て非常によく似た何かをします。 MethodInvokerを見てください。ディスパッチャーの代わりに、あなたは本当にメインフォームから呼び出すだけです。

+0

問題に慣れるには、両方のServerProc方法は、イベントハンドラありあり - 既存によって呼び出されます非UIスレッド上のコード。この場合、BackgroundWorkerがどのように役立つかを確認してください。私は彼が既存のサーバリスニング/イベント発生コード(イベントハンドラだけ)を書き直したいとは思わない。すでにUIスレッドではない。 – Ricibob

+0

ありがとうございます! ;私はメソッドの呼び出しを使用!いいえ、私はついにこのアプリケーションを手に入れることができません。大きな助け。ありがとう。 –

+0

@AlexOgdenこの方法で解決策が得られた場合は、左側のチェックマークをクリックして回答を受け入れてください。 – Ricibob

関連する問題