2012-01-18 5 views
0

私のWindowsフォームアプリケーションでは、wcfサービスのサブスクライバです。サブスクリプションコードを実行するためにバックグラウンドワーカークラスを使用しています。そのため、「購読」ボタンをクリックすると、接続しようとするとUIがハングしません。サービスへ。バックグラウンドワーカーの後にWindowsフォームのUIスレッドにアクセスしますか?

バックグラウンドワーカーを接続に使用した後、パブリッシャからの投稿を受信すると、次のコードを使用してもUIスレッドにアクセスできないようです。

次の実装では、サービス上で作成されたpostReceived()メソッドで行われていた、それは加入者が投稿が発行者によって投稿されたときにいたときに

 backgroundForm b = (backgroundForm)Application.OpenForms[0]; 

     b.BeginInvoke((MethodInvoker)delegate() 
     { 
      //codes to do whatever i wan to do with the GUI 
      //Examples of it would be disposing a flowlayout panel 
      //and re-adding it back and populating it again to 
      //show the refreshed values. 
     }); 

(WCF購読公開)何が起こるかを処理します誰もこれを解決する方法を考えている?

次いで

他EDIT UIコード実行されない、私はまた、転記が受信されるたびに、それはまた行くフィードバックのためにユーザにポップアップとして作用tempFormを表示している点からなります

  notificationForm tempForm = (notificationForm)notificationList[notificationList.Count - 1]; 
      tempForm.Show(); 

上記のコードも実行されませんでした。

+0

これを行うとどうなりますか?あなたは例外を取得していますか? –

+0

例外はありません、コードの種類は....うまくいかないのですか?笑。 – Thomas

+0

なので、どのコード(実際には動作しません)は実際にコメントになっていますか? – Peladao

答えて

1

UIにアクセスするには、System.Windows.Threading.Dispatcherを使用する必要があります。あなたはBackgroundWorkerのを使用せずにasyncronously WCFサービスを呼び出すことができます実際

b.BeginInvoke((MethodInvoker)delegate() 
{ 
    Dispatcher.Current.Invoke((Action)(DoTheUiThings()); 
}); 
+0

こんにちは、私は最初の議論のアクションは何ですか? – Thomas

1

はこのような何かを試してみてください。その答えはthis threadです。

あなたは次の質問をしてください。「Application.OpenForms [0]があなたの呼び出しフォームですか?」

最後に、フォームUIエレメントを更新するための簡単なInvoke()メソッドの代わりに、BeginInvokeを使用する理由がわかりました。それは長期的な操作ではありません。

Mayne私はあなたのコードで何かを理解していませんでした - より正確なエラーや問題を指定してください。

+0

こんにちは、私が試したwcfサービスを非同期的に呼び出すとしても、それはまだ動作せず、UIコードは実行されません。 – Thomas

関連する問題