呼び出し元のスレッドをブロックするがキャンセルをサポートしないメソッドの (ばかげた) 例を次に示します。
Public Sub WorkUntil5()
Threading.SpinWait.SpinUntil(Function() Now.Hour >= 17)
End Sub
最悪の場合、このメソッドを呼び出してから戻るまでに 17 時間かかります。このメソッドのソース コードにアクセスできないふりをします。CancellationToken を受け取るメソッドで呼び出しをラップするにはどうすればよいですか?
目標は、WorkUntil5()
キャンセルが要求されるまで実行することです。その時点で、コールは可能な手段を使用して終了する必要があります。
これが私が自分自身を思いつくことができる最良の方法です。タスクを使用しますが、それでも呼び出し元のスレッドをブロックします。それについて何かが正しく感じられません。mres.Set()
最初の呼び出しが返されたら、より良い呼び出し方法があるはずだと考えています。
Public Sub WorkUntilYouGetBored(cancellationToken As Threading.CancellationToken)
Dim mres As New Threading.ManualResetEventSlim
Using cancellationToken.Register(Sub() mres.Set())
Dim t = Task.Factory.StartNew(Sub() WorkUntil5())
t.ContinueWith(Sub() mres.Set())
mres.Wait()
End Using
If cancellationToken.IsCancellationRequested Then
Console.WriteLine("You went home early.")
Else
Console.WriteLine("It's time to go home.")
End If
End Sub