如果他们过早地停止,就抓住并行任务

时间:2012-05-16 15:23:35

标签: vb.net task-parallel-library

之前我在parallel.foreach与Task.Factory.StartNew上收到了一些很好的建议。我已经实现了两者并且对两者的效率感到惊讶。我使用以下链接http://msdn.microsoft.com/en-us/library/dd997415.aspx来尝试理解异常,并将其合并,以便在任务因程序检测到任何原因而停止时通知。有没有任何明确的方法可以在没有wait()或waitall的情况下执行此操作,这将同时关闭接口和其他任务。

Try
     pcounter += 1
     Dim factory As Task = Task.Factory.StartNew(AddressOf FileParser.Module1.Main)
        If factory.IsCompleted Then
            appLogs.constructLog("GT19 Task Completed", True, True)
        End If
        Button1.Text = pcounter.ToString & " processes started"
        If Not TextBox1.Text = "" Then
            Module1.inputfolder = TextBox1.Text
        End If


    Catch ae As AggregateException
        For Each ex In ae.InnerExceptions
            appLogs.constructLog(ex.Message.ToString & " ", True, True)
        Next
        Button1.Text = "ERROR RECEIVED"
    Catch ex As Exception
        If ex.Message.Contains("cannot access") Then
            appLogs.constructLog(ex.Message.ToString & " ", True, True)
        End If
        appLogs.constructLog(ex.Message.ToString & " ", True, True)
        appLogs.constructLog(" Cancelling process ", True, True)
    Finally
        Module1.ctsources.Cancel()
    End Try

现在我尝试使用按钮调用和函数测试它:

   Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
  Module1.ctsources.Cancel()
  Button2.Text = "process stopped"

在FileParser.Module1.Main

If ct.IsCancellationRequested Then
                sendErrorEmail()
                Exit Sub
End If

但我没有得到任何确认该过程停止的确认。如果使用parallel.foreach

也是如此
        Dim po As New ParallelOptions
        po.MaxDegreeOfParallelism = 3
        Parallel.ForEach(fileLists, po, Sub(page) processFile(page))

1 个答案:

答案 0 :(得分:1)

您的Catch无法捕获Task引发的异常,因为StartNew()没有阻止,因此当抛出异常时Catch不再处于活动状态

如果您想在Task完成后执行某些操作,则可以使用ContinueWith()的重载之一。其中一些允许您指定延迟运行的确切时间:仅当任务成功完成,如果它是故障或取消(或它们的组合)。