2016-10-13 14 views
1

私は、通常、古い方法(スレッド化、呼び出しなど)でマルチスレッド化します。私は多くのドキュメンテーションを見てきましたが、以下を思い付いています。Async/Awaitを初めて使用した場合、これは非同期で実行されますか?

この投稿の理由は、私がここで何百ものスレッドを見ているということです。なぜなら、どうしたのですか?とにかく同期して実行しています。私はこれが正しいとみなし、非同期的に動いていると仮定するために私の以前の読書に基づいて自信を持っていません。それは困難なコードではなく、それは私には正しいように見えます - 単に「はい」または「いいえ」が必要で、「いいえ」ならば説明が素晴らしいでしょう。前もって感謝します。

プログラムはループで契約を送信します。 pdfsがファックス回線に接続する場合、同じ番号に送信するまでに15秒待つ必要があります。タイマー/クラスロジックは複雑なものになりますが、この目的のために、いったん完了すると自分自身を消去するList(Class of)があることを知ってください。リストが空になると、GUIを更新するためのイベントが発生します。

GUIスレッド - 私は評価することが可能として、このようにシンプルにする必要があるコードを剥奪しまし

Private Async Sub ProcessIt(ByVal oList As List(Of String)) 
    'Code that sends emails, or creates the queue class and adds it to queue. 
    Dim bWait As Boolean = Await WaitOnQueue() 
    RaiseEvent ProcessComplete(ErrorList, Nothing) 
End Sub 

"Awaitable" 機能(と思う)

Private Async Function WaitOnQueue() As Task(Of Boolean) 
    While oQueue.Count > 0 
     Await Task.Delay(500) 
    End While 
    Return True 
End Function 

を呼び出します。これは非同期またはGUIスレッドで実行されていますか?もう一度おねがいします。

答えて

1

明確にするには、asyncキーワードをメソッドに追加しても、メソッドは非同期になりません(仮定したように)。これは、メソッド内にawaitというキーワードを使用することが許可されていることを意味します。

Task.Delayに関しては、非同期で実行することを意図しています。 Task.Delayは現在のスレッドをブロックすることなく論理遅延を与えます。

しかし、あなたの例では、Task.Delayは、あなたのメソッドがUIスレッドでCPUバインドされた作業をやっているようにしています。あなたの目標がUIスレッドから何らかの作業をすることであれば、await Task.Runを使用してスレッドプールスレッド上でそれを実行し、メソッドの結果を(非同期に)得ることができます。

+0

いいえ私はasyncだけであなたはawaitを使用できるようになります。私の思考プロセスは、待っていたTask.Delayが別のスレッドでタイマーを起動し、500ミリ秒後に復帰するということでした。そうでなければ私はちょうどThread.Sleepを使用していたでしょう...私はあなたを正しく理解していれば、Task.Delayは実際にThread.Sleepとは違ったことをするわけではないので、Task.Runを調べる必要があります。 – Aaron

+0

@Aaron Thread.Sleepはブロックします現在のスレッドTask.Delayは、現在のスレッド操作をブロックせずに論理遅延を許可します。 Task.Delayは新しいスレッドを作成しません。内部的にスレッドプールを使用するタイマーを内部的に使用します。 –

+0

Ok William、情報ありがとう。 Task.Runを見てみましょう。私はあなたの時間と説明に感謝します。 – Aaron

関連する問題