我正致力於將使用線程的舊代碼替換爲基於.NET 4.5任務的系統。如何在沒有ByRef的情況下處理異步函數?
我有以下的我想轉換的子;
Public Function Delay(Milliseconds As Integer, ByRef Job As Job) As Boolean
For i As Integer = 1 To CInt(Milliseconds/100)
Thread.Sleep(100)
If Job.IsCancelled Then Return True
Next
Return False
End Function
作業類是我自己的,但重要的是它包含了被設置爲1,如果作業應取消的整數。所以,Delay函數允許我將線程休眠X毫秒,但是如果在此期間作業被取消,它將會停止休眠並返回True。
我不知道如何用Await Task.Delay做到這一點,這是我的嘗試;
Public Async Function Delay(Milliseconds As Integer, Job As Job) As Tasks.Task(Of Boolean)
For i As Integer = 1 To CInt(Milliseconds/100)
Await Tasks.Task.Delay(100)
If Job.IsCancelled Then Return True
Next
Return False
End Function
我遇到的問題是,異步方法不允許我使用的ByRef,這意味着它將無法在作業已被取消檢測。另一個問題是,在try/catch/finally或者一個synclock裏面不能使用await。我的印象是,你可以編寫看起來像同步代碼的異步代碼。我如何解決這些問題?
感謝您提供有關CancellationToken的信息。我在剛剛回答之後按問題編輯,但我在舊代碼中使用新函數時也遇到問題。我不能在synclock部分使用它。有沒有辦法解決這個問題? – iguanaman 2014-09-10 19:39:24
@iguanaman這是一個完全獨立的問題,與你目前所問的問題完全不同。你應該問一個關於它的新問題。您還應該包含您正在使用的特定代碼,因爲這非常相關。 – Servy 2014-09-10 19:41:27