ActionBlock Completion.Wait状态似乎挂起整个程序

时间:2014-11-07 17:48:28

标签: vb.net task-parallel-library

下面的程序按照我的意图运行,它表明两个不同的ActionBlock使用两个不同的线程。但是,我读过的所有内容都说我应该使用ActionBlock.Completion.Wait()以允许ActionBlock完成其工作。当我把它(当前被注释掉)添加到这个程序时,它会挂起。

是不是因为我试图从UI线程启动ActionBlocks?我应该把整个烂摊子包裹在BackGroundWorker中吗?

Imports System.Data.SqlClient
Imports System.Threading.Tasks.Dataflow
Imports System.Windows.Forms

Public Class Form1
Protected _theConn As SqlConnection
Protected _DataList As New List(Of UISyncer)
Protected _TableList As New List(Of String)

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load


    _theConn = New SqlConnection("Server=USFRNDCUSHING2\MSSQSERVER2012;Database=ActionTaskTest;User Id=sa;Password=Sa1234;")
    _DataList.Add(New UISyncer("ActionTaskOne", txtParallel1))
    _DataList.Add(New UISyncer("ActionTaskTwo", txtParallel2))

    _TableList.Add("ActionTaskOne")
    _TableList.Add("ActionTaskTwo")

End Sub

Private Function ReadFromTable(ByVal tableName As String) As DataSet
    Dim ds As New DataSet()
    Dim adapt As SqlDataAdapter = New SqlDataAdapter()
    Dim selectString As String = "SELECT * FROM " & tableName

    adapt.SelectCommand = New SqlCommand(selectString, _theConn)
    _theConn.Open()
    adapt.Fill(ds, tableName)
    _theConn.Close()

    Return ds
End Function

Private Sub readBtn_Click(sender As Object, e As EventArgs) Handles readBtn.Click
    txtOut1.ResetText()

    DoTheWorkSimpler()

End Sub

Private Sub DoTheWorkSimpler()
    For Each tableName As String In _TableList
        Dim dsResult As DataSet = ReadFromTable(tableName)
        DealWithDataSet(dsResult, 1, tableName)
    Next
End Sub

Private Sub DealWithDataSet(ByRef dsResult1 As DataSet, ByVal maxDegreeOfParallelism As Integer, ByVal tableName As String)


    Dim workerBlock = New ActionBlock(Of DataRow)(Function(dr) DoStuff(dr), New ExecutionDataflowBlockOptions() With {.MaxDegreeOfParallelism = maxDegreeOfParallelism})

    For Each dr As DataRow In dsResult1.Tables(tableName).Rows
        workerBlock.Post(dr)
    Next
    workerBlock.Complete()

    'Here is my question, why does this hang my program
    'workerBlock.Completion.Wait()  'This just seems to hang the whole danged thing.

End Sub

'This might want to be shared, if it wasn't writing to the text box
Private Function DoStuff(ByRef dr As DataRow)

    Dim theString As String = dr("TaskDesc").ToString() & " on Thread: " & Threading.Thread.CurrentThread.ManagedThreadId & Environment.NewLine
    AppendTextBox(theString)

    Return Nothing
End Function

Public Sub AppendTextBox(value As String)
    If InvokeRequired Then
        Me.Invoke(New Action(Of String)(AddressOf AppendTextBox), New Object() {value})
        Return
    End If
    txtOut1.Text += value
End Sub

End Class

0 个答案:

没有答案