2017-07-08 36 views
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 
+1

マイクロソフトでは、Task.Runを使用するだけで、非同期オーバー同期を偽造するべきではないとも言います。 TaskCompletionSourceを見てください。 –

+0

返信ありがとう@PauloMorgado。非同期の同期を偽ってどういう意味を説明できますか?私のコードをどのようにリファクタリングするのかという少しの例を私に教えてください。私はTaskCompletiionSourceについて多くのことを読んでいましたが、正直言って、私はその目的を非常によく理解していません... –

+2

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/ –

答えて

0

感謝。

関連する問題