私はWindows Formsアプリケーション(.NET C#4)でホストされているWCFサービスを持っています。これはそれ自身のスレッドで実行されます。メソッドがWCFサービスで呼び出されると、List(つまりList)を更新し、Form内のListViewがその行をディスプレイに追加します。WCFサービスからListViewを更新する方法
は何これを達成するための最良の方法だろうか?
私はWindows Formsアプリケーション(.NET C#4)でホストされているWCFサービスを持っています。これはそれ自身のスレッドで実行されます。メソッドがWCFサービスで呼び出されると、List(つまりList)を更新し、Form内のListViewがその行をディスプレイに追加します。WCFサービスからListViewを更新する方法
は何これを達成するための最良の方法だろうか?
ウィンドウの下では、コントロールはプライマリアプリケーションまたはGUIスレッドで更新する必要があり、疑わしい場合はワーカースレッドから更新する必要があります。これの主な理由は、コントロールがプライマリスレッドによって処理される必要があるWindows Message Pumpを使用することです。
非UIスレッドからコントロールを更新するにはスレッドマーシャリングワーカースレッドからUIスレッドへのデータ。これは簡単なことです。あなたは非同期それぞれ同期しているBeginInvokeを()またはを呼び出し()を介して呼び出されるデリゲートコールバックメソッドを作成します。
myListBox.BeginInvoke(new MyDelegate(DelegateMethod), "hi there");
public void DelegateMethod(ListView myControl, string message)
{
myControl.Items.Add (message);
}
パフォーマンスのニーズに応じて、あなたは呼び出し()ブロックワーカースレッドとは対照的に、更新はバックグラウンドで行わ持っているBeginInvokeメソッド()を使用することをお勧めします。あなたがあまりにも多くを行う場合、いくつかのメッセージが失われることは言うまでもなく、Windows Message Pumpがスラッシュされているので、時間間隔ごとにBeginInvoke()を実行するとアプリケーションのパフォーマンスが低下する可能性があります。現実的には、これが発生するにはかなりの時間がかかる必要があり、それは他のパフォーマンス要件と引き合いに出ます。
は、すべてがうまく
this article行くさらにそれを説明したいと考えています。