【问题标题】:Troubles with data from Task thread来自任务线程的数据问题
【发布时间】:2013-07-24 16:47:09
【问题描述】:

我有一种方法可以为我的每个产品收集各种文件。我想让该方法异步,因为它从其他网站下载文件。我做了这个代码:

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)

但是当它等待并且我试图访问我产品列表中产品中的 SDS、APB 或 PDB 时,它们只是空对象。我可以看到我的“getter”方法返回得很好,但数据永远不会进入 product.SDS 属性等。

【问题讨论】:

    标签: vb.net task-parallel-library


    【解决方案1】:

    您的代码尝试更新对已更改产品的引用。当继续运行时,product 指向的实例是外部product 变量当时具有的任何值。它可以是列表中的最后一个产品,也可以是任何其他产品。

    这不是错误,而是外部变量捕获与 lambda 一起使用的方式。

    不要尝试访问外部变量,而是将其值作为状态值传递给TaskFactory.StartNew(Action(Of Object),Object)

    对 ContinueWith 的调用也是如此。如果您想修改上一步中使用的产品,您应该将其作为结果的一部分传递到下一步,也许使用元组来执行此操作。

    【讨论】:

      【解决方案2】:

      ContinueWith 不会修改现有任务,而是返回一个新任务,该任务将在继续完成后完成。您正在等待原始任务(如 apbTask),您应该在此处等待 ContinueWith 调用的结果。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-07-13
        • 1970-01-01
        • 1970-01-01
        • 2016-07-23
        • 1970-01-01
        • 1970-01-01
        • 2011-05-24
        相关资源
        最近更新 更多