1

私のシナリオは、クラスライブラリにラップされた.NET4.5クライアントによって呼び出される.NET4.0WCFサービスで構成されています。

クライアントはWCFサービスを非同期で呼び出し、返されたデータを表示します。そのコードはかなり標準的なものであり、次のようになります。

Private m_Service As WcfService = Nothing

Public Event GetDataComplete As GetEventHandler

Public Sub GetData(bytes As Byte())

    m_Service = New WcfService()
    AddHandler m_Service.GetWcfDataComplete, AddressOf Service_GetWcfDataComplete
    m_Service.GetWcfData(bytes)

End Sub

Private Sub Service_GetWcfDataComplete(sender As Object, e As WcfService.GetWcfDataCompletedEventArgs)

    ' Process results from server...
    ' Signal completion.
    RaiseEvent GetDataComplete(Me, New GetEventArgs(New DataItem(e.Result)))

End Sub

WCFサービスは返されるデータを64kチャンクに制限するため、すべてがダウンロードされるまで、サービスを複数回呼び出す必要があります。また、' Process results from server...返されたデータでUIを更新する処理も行います。予想通り、これはUIスレッドに恐ろしいことをします。

したがって、タイトルの質問-複数の非同期WCF呼び出しの完了を待機する単一のバックグラウンドスレッドを作成するにはどうすればよいですか?

私が試したが失敗したこと:

  • パターンを使用しAsync/Awaitます。Visual Studioによると、バイト配列は待機できません。私はそれから自分の道をハックする方法がわかりません。
  • を使用しBackgroundWorkerます。このアプローチを使用すると、プロセスの終了を通知する方法がわかりません。DoWorkEventArgsWCF呼び出しはコールバックを使用するため、 WCFサービス呼び出しが戻ったときにアクセスできなくなりました。
4

1 に答える 1

0

始める前に、これは技術的に答えを構成するものではありません。このサイトでは、コメントに入力できるテキストの量が制限されているため、代わりにこれを回答として投稿しました。

そう:

私はさまざまなアプローチで遊んできました。理想的な解決策は、非同期呼び出しが戻るまでブロックする本格的なマルチスレッド モデルのようです。スレッドが 1 ~ 2 秒以上存続しない場合 (サーバーとの通信が良好であることを前提とします) は、非常に手間のかかるアプローチのように見えますが、まれに数分間存続する場合があります。非同期モデルでは、サーバーへの呼び出しが行われた後、呼び出しのコールバックが起動される前にバックグラウンド ワーカーが終了するため、ブロック スレッドである必要があります。

私が現在使用している解決策は、サーバーから送られてくるすべてのデータをキューに入れ、キューに項目がある場合にバックグラウンド ワーカーを開始することです。バックグラウンド ワーカーは項目をデータベースに保存し、モデルに項目を追加します。これにより、UI を更新するイベントが発生します。

キュー アプローチには重大な欠陥があります。すべてがダウンロードされた後、バックグラウンド ワーカーがすべてのアイテムをキューから取り出して処理する前にアプリが終了した場合、それらのアイテムはクライアントに失われます。これは、サーバーがアイテムが同期されていると見なすためです。

それを解決するためのすべてのアプローチは面倒だと思います(たとえば、デキューして保存したらサーバーにコールバックし、同期を確認するか、保存してからエンキューして処理します)、他の提案は大歓迎です。

于 2013-01-30T11:38:30.560 に答える