【发布时间】:2015-08-04 11:35:16
【问题描述】:
我正在尝试同时运行 10 个进程,当它们完成时我想显示一个 messagebox。 UI 应该保持响应。
我有这个功能(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