0
私は方法Sub Foo(fooParam as String)
を持っていると私は今、私が進行し、取り消しを必要とする 署名非同期。同期方法
Function FooAsync (fooParam as String) as Task
Return Task.Run(Sub() Foo(fooParam))
End Function
などの非同期バージョンを書きたいので、私は
Function FooAsync (fooParam as String, progress as IProgress(of String), cancellationToken as CancellationToken) as Task
Return Task.Run(Sub() Foo(fooParam))
End Function
マイクロソフトに署名を変更する必要がある場合非同期バージョンは同期バージョンと同じシグネチャを持つ必要がありますので、ここでベストプラクティスとは何か、それとも間違っているのでしょうか?
進捗状況とキャンセルをトグルして同期します。方法は私のために無意味に見えます...しかし、私はただ同期をラップすることができます。メソッドを呼び出し、それをタスクとして返します。
ここでコードの理解を深めるために、私は今どのようにやっているのですか?非同期では、進行とキャンセルの呼び出しを追加するsyncメソッドが書かれました。しかし、私は、これは私がこれを行うべき方法ではないと確信している:私は彼が投稿記事を読むことで、ここでのガイドラインを理解することができ、およびそれらに関連する他のだった@PauloMorgadoへ
Public Sub DoCalibration(calibrationHoldTimeForReading As Integer)
If Not PressureCalibrator.SerialPort.IsOpen() Then
PressureCalibrator.SerialPort.Open()
End If
PressureCalibrator.PressureUnit = PressureUnit.bar
For Each point In InputList
SetMessPointAndMeasure(point, calibrationHoldTimeForReading)
Next
PressureCalibrator.Vent()
PressureCalibrator.SerialPort.Close()
Log.WriteLog("Calibration completed.")
End Sub
Public Function DoCalibrationAsync(calibrationHoldTimeForReading As Integer, Optional progress As IProgress(Of CalibrationStepResult) = Nothing, Optional cancellationToken As CancellationToken = Nothing) As Task
Return Task.Run((Sub()
If Not PressureCalibrator.SerialPort.IsOpen() Then
PressureCalibrator.SerialPort.Open()
End If
PressureCalibrator.PressureUnit = PressureUnit.bar
For Each point In InputList
Dim measureResult = SetMessPointAndMeasure(point, calibrationHoldTimeForReading)
If Not IsNothing(cancellationToken) Then
CancellationToken.ThrowIfCancellationRequested()
End If
If Not IsNothing(progress) Then
progress.Report(measureResult)
End If
Next
PressureCalibrator.Vent()
PressureCalibrator.SerialPort.Close()
Log.WriteLog("Calibration completed.")
End Sub), cancellationToken)
End Function
マイクロソフトでは、Task.Runを使用するだけで、非同期オーバー同期を偽造するべきではないとも言います。 TaskCompletionSourceを見てください。 –
返信ありがとう@PauloMorgado。非同期の同期を偽ってどういう意味を説明できますか?私のコードをどのようにリファクタリングするのかという少しの例を私に教えてください。私はTaskCompletiionSourceについて多くのことを読んでいましたが、正直言って、私はその目的を非常によく理解していません... –
http://blog.stephencleary.com/2013/10/taskrun-etiquette-and-proper- usage.htmlとhttps://blogs.msdn.microsoft.com/pfxteam/2012/03/24/should-i-expose-asynchronous-wrappers-for-synchronous-methods/ –