2011-11-29 70 views
1

如果你有Task.Wait()不包括任何链接(ContinueWith)任务

Private Shared Sub msg(Optional message As String = "") 
    Debug.WriteLine(Threading.Thread.CurrentThread.ManagedThreadId & " " & message) 
End Sub 
<TestMethod()> 
Public Sub TestMethod1() 
    Dim cancel As New Threading.CancellationTokenSource 
    msg("starting") 
    Dim start As DateTime = DateTime.Now 
    Dim task As New Task(Sub() 
          msg("in thread") 
          Do Until Now.Subtract(start).TotalMilliseconds > 2000 
           Threading.Thread.Sleep(500) 
           msg("loop") 
           cancel.Token.ThrowIfCancellationRequested() 
          Loop 
         End Sub, cancel.Token, TaskCreationOptions.LongRunning) 
    task.ContinueWith(Sub(result As task) 
          msg("Continue task running") 
          Debug.WriteLine(result.Status.ToString & If(result.Exception Is Nothing, ", no exception", ", exception occurred " & result.Exception.GetType.Name)) 
          Do Until Now.Subtract(start).TotalMilliseconds > 10000 
           cancel.Token.ThrowIfCancellationRequested() 
           Threading.Thread.Sleep(500) 
           msg("innerloop") 
          Loop 
         End Sub) 
    task.Start() 
    Try 
     If Not task.Wait(4000, cancel.Token) Then 
      msg("wait expired, time to cancel)") 
      cancel.Cancel() 
     End If 
     task.Wait() 

    Catch ex As OperationCanceledException 
     msg("task was cancelled") 
    Finally 
     msg("finishing") 
    End Try 
End Sub 

的问题是,当我做task.Wait(4000,cancel.Token)这应该最终失败的ContinueWith任务不会在超时时间内完成。

似乎等待只适用于任务,并没有考虑到链,我怎么能等到“链”完成?

+0

为什么要考虑链条?这不是如何工作的。 –

回答

7

等待ContinueWith函数返回的任务。

+0

ContinueWith返回的任务等待中的问题是,该任务尚未开始,直到正在运行的任务完成。所以它实际上并不等待。必须承认我没有尝试过WaitAll,包括这两个任务,你的想法? – AussieALF

+0

我的意思是存储继续任务并在开始初始任务后等待它。您也可以考虑使用更方便的Task.Factory.StartNew,而不是创建新任务并稍后启动它,因为它可以避免此类问题。 –