1

メールヘッダーから値を抽出する関数があります。スピードアップするために、フレームワーク 4.5 の async を使用したいと考えていました。これは、非同期を使用する最初の試みです。

抽出関数を非同期で数回連続して呼び出して、さまざまな値を取得しています。メールヘッダーから。私が問題を抱えているのは、すべてのインスタンスがいつ完了したかを知る方法です。例は見つかりましたが、条件付きタスクの状況に合うものはありませんでした。

私はする必要があると信じています:

  • タスク配列を暗くする
  • 必要な各タスクを配列に追加します
  • その後、 Task.WhenAll を使用します

しかし、私はそれを行う方法がわかりません。

            'Extract these vars from header if no value was passed
            'Calling HeaderExtract Async for speed
            If Len(sClient) = 0 Then
                sClient = HeaderExtractAsync("Client,", sHeaders).Result
   ' --> Add this as a new task?
            End If
            If Len(sSubscriptionNum) = 0 Then
                sSubscriptionNum = HeaderExtractAsync("SubscriptionNum,", sHeaders).Result
            End If
            If Len(sTargetID) = 0 Then
                sTargetID = HeaderExtractAsync("TargetID,", sHeaders).Result
            End If
            If Len(sAddressBook) = 0 Then
                sAddressBook = HeaderExtractAsync("AddressBook,", strHeaders).Result
            End If

' --> Check that all are done?
4

2 に答える 2

1

良い。非同期プログラミングを使用しているようですが、まったく使用していません。まず、ここでこれについて読むことをお勧めします: http://blogs.msdn.com/b/windowsappdev/archive/2012/04/24/diving -deep-with-winrt-and-await.aspxおよびここ: http://blogs.msdn.com/b/windowsappdev/archive/2012/06/14/exposing-net-tasks-as-winrt-asynchronous-operations .aspx、これらのリソースは WinRT を対象としていますが、画像が得られる場合があります。

これで、メソッドは a を返しますTask<TResult>(これは問題ありません) が、呼び出しによってResult、結果が何かを返す前に Task が終了するのを常に待機することを考えると、これを効果的に同期させることになります。これを非同期にする方法は次のようになります。

If Len(sClient) = 0 Then
    Dim tClient as Task(Of Whatever) = HeaderExtractAsync("Client,", sHeaders)
    tClient.Start()
End If

次に、タスクが終了したかどうかを次のように確認します。

If tClient.IsCompleted Then
    DoSomething()
Else
    ContinueWaiting();
End If

おそらく、これをループに入れて、タスクが完了していない場合は完了するまで待つことを確認できます。

編集:

タスクをスレッドとして使用したいようですが、それは可能ですが、タスクはこの目的には完全ではありません。タスクは、完了するまでに時間がかかる可能性のあるアクティビティをトリガーするためのものであり、それが完了すると完了しますメイン スレッド (通常は UI スレッド) をブロックすることなく、呼び出し元の関数にコントロールを正確に戻します。これを念頭に置いて、ここでも読むことができます。 /benwilli/archive/2013/04/24/tasks-are-not-threads.aspxHeaderExtractAsync 、完了までに時間がかかると仮定して、タスクを適切に使用する方法の例を次に示します。

If Len(sClient) = 0 Then
    sClient  = Await HeaderExtractAsync("Client,", sHeaders)
End If
于 2013-06-14T19:03:43.817 に答える