2013-07-23 51 views
0

我有一種方法可以收集每個產品的變化文件。我想讓該方法異步,因爲它從其他網站下載文件。香港專業教育學院取得驗證碼:來自任務線程的數據出現故障

For Each product In productList 
    If model.Sds Then 
     Dim sdsTask As Task(Of ZipFile) = Task(Of ZipFile).Factory.StartNew(Function() GetSafetyDataSheets(product.Product)) 
     sdsTask.ContinueWith(Sub(t) 
           product.SDS = t.Result 
           Debug.WriteLine("test") 
          End Sub, TaskContinuationOptions.OnlyOnRanToCompletion) 
     taskList.Add(sdsTask) 
    End If 
    If model.Apb Then 
     Dim apbTask As Task(Of List(Of ZipFile)) = Task(Of List(Of ZipFile)).Factory.StartNew(Function() GetAPB(product.Product, model.Department)) 
     apbTask.ContinueWith(Sub(t) product.Instruction = t.Result) 
     taskList.Add(apbTask) 
    End If 
    If model.Pdb Then 
     Dim pdbTask As Task(Of ZipFile) = Task(Of ZipFile).Factory.StartNew(Function() GetProductDatasheet(product.Product)) 
     pdbTask.ContinueWith(Sub(t) product.PDB = t.Result) 
     taskList.Add(pdbTask) 
    End If 


Next 

Task.WaitAll(taskList.ToArray) 

但是,當它已經等待和IM試圖訪問SDS,APB或PDB的產品在我的產品列表,他們只是空對象。我可以看到我的「getter」方法返回正常,但數據永遠不會使其產生.SDS屬性等。

回答

1

您的代碼嘗試更新對已更改產品的引用。延續運行時,product指向的實例是當時外部product變量具有的值。它可能是列表中的最後一個產品,或者任何其他產品。

這不是一個錯誤,而是外部變量捕獲與lambdas一起工作的方式。

而不是嘗試訪問外部變量,將其值作爲狀態值傳遞給TaskFactory.StartNew(Action(Of Object),Object)

對ContinueWith的調用也是如此。如果要修改上一步中使用的產品,則應將其作爲結果的一部分傳遞給下一步,可能使用Tuple執行此操作。

1

ContinueWith不會修改現有任務,而是返回一個新任務,延續已經完成。您正在等待原始任務(如apbTask),您應該在那裏等待ContinueWith調用的結果。