2011-06-23 12 views
1

私はWindows Formsアプリケーション(.NET C#4)でホストされているWCFサービスを持っています。これはそれ自身のスレッドで実行されます。メソッドがWCFサービスで呼び出されると、List(つまりList)を更新し、Form内のListViewがその行をディスプレイに追加します。WCFサービスからListViewを更新する方法

は何これを達成するための最良の方法だろうか?

答えて

1

ウィンドウの下では、コントロールはプライマリアプリケーションまたは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行くさらにそれを説明したいと考えています。

関連する問題