【问题标题】:Waiting for all Tasks in Async to complete等待异步中的所有任务完成
【发布时间】:2015-08-04 11:35:16
【问题描述】:

我正在尝试同时运行 10 个进程,当它们完成时我想显示一个 messageboxUI 应该保持响应。

我有这个功能(MultiProcessImages),它在所有images完成之前显示一条消息:

 'Start multi processing of images
    Public Shared Async Function MultiProcessImages() As Task
        'Create a task factory and add 10 process one for each ending image number
        Dim t As Task = Nothing
        For i As Integer = 0 To 9
            Dim temp_i As Integer = i
            t = Task.Factory.StartNew(Function() Cheque.CopyBinaryValueToFile(temp_i))
            Await t
        Next
    End Function

然后我创建了另一个函数,它使UI 无响应,并且处理似乎不是多任务处理(这意味着它不会并行执行CopyBinaryValueToFile 的所有操作,但仅针对每个任务编号):

Public Shared Async Function MultiProcessImages**2**() As Task
        Dim tasks As New List(Of Task)()
        For i As Integer = 0 To 9
            Dim temp_i As Integer = i
            tasks.Add(Cheque.CopyBinaryValueToFile(temp_i))
            ' tasks.Add(Task.Factory.StartNew(Function() Cheque.CopyBinaryValueToFile(temp_i)))
        Next
        Await Task.WhenAll(tasks)
        MessageBox.Show("done")
    End Function

有什么想法可以让它表现得像我在第一个函数中的那样,但要等到所有进程完成后才显示消息?

编辑

我这样调用函数:

 Private Async Sub cmdConvert_Click(sender As Object, e As EventArgs) Handles cmdConvert.Click
        'Await Cheque.CopyBinaryValueToFile()
        '{Time count
        Dim start_time As DateTime
        Dim stop_time As DateTime
        Dim elapsed_time As TimeSpan
        start_time = Now
        '}

        Await Cheque.MultiProcessImages2()

        '{Time count
        stop_time = Now
        elapsed_time = stop_time.Subtract(start_time)
        MessageBox.Show("elapsed_time = " & stop_time.Subtract(start_time).ToString & Environment.NewLine _
        & elapsed_time.TotalSeconds.ToString("0.000000"))
        '}
    End Sub

【问题讨论】:

  • 显示从哪里调用方法(按钮点击等)
  • @Ric 我刚刚添加了调用函数
  • Cheque.CopyBinaryValueToFile() 是做什么的?
  • @Ric 它从数据库中下载 blob,解压缩,调整图像大小,将调整大小的图像插入表中,删除提取和调整大小的文件。它需要一个数字,因为它处理数据库中recordid =以动态数字0-9结尾的所有记录
  • 这是来自 MSDN 的引用:“不能等待作为 Sub 过程或具有 void 返回类型的异步方法,并且返回 void 的方法的调用者无法捕获任何方法抛出的异常。” msdn.microsoft.com/en-us/library/hh191443.aspx 你最好这样做:tasks.Add(Task.Run(Function() Cheque.CopyBinaryValueToFile(temp_i)))

标签: vb.net multithreading asynchronous


【解决方案1】:

在没有看到您的其余代码和Cheque.CopyBinaryValueToFile() 的实现的情况下,以下内容可能会帮助您解决 UI 被阻止的问题:

MultiProcessImages2()内:

tasks.Add(Task.Run(Function() Cheque.CopyBinaryValueToFile(temp_i)))

【讨论】:

    猜你喜欢
    • 2016-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-26
    • 1970-01-01
    相关资源
    最近更新 更多