是否可以从"非主要"调用函数?线程然后在执行其余的之前等待它完成?
我可以在之前设置一个布尔值,然后使函数"翻转"它完成后布尔值为false,但我想知道是否有更简单/更专业的方法来实现这个目标?
由于
答案 0 :(得分:2)
我想你希望保持你的表单响应,但你不想要调用额外的程序或类似的东西。
在这种情况下,Async
和Await
关键字可能是您的好方法:
这里详细解释http://msdn.microsoft.com/en-US/en-en/library/hh191443.aspx但我会简要介绍一下:
Async
关键字声明方法。这可以是例如下面示例中处理按钮点击事件的方法。await
关键字将其分配给临时变量。以下是一个小例子(仅在Button
上抛出Label
和Form
):
Public Class Form1
''' <summary>
''' This method does the work. It is called from the async method in form of a Task(Of String).
''' </summary>
Private Function GetString() As String
'Some delay
Threading.Thread.Sleep(3000)
Return "Hello World!"
End Function
'Note the Async Keyword
Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
'First create the task
Dim t As Task(Of String) = New Task(Of String)(AddressOf GetString)
'Start the task
t.Start()
'Wait for the task to complete. Does not suspend your GUI!
'Much preferrable to some kind of waiting loop with DoEvents and stuff.
Dim Result As String = Await t
'Signal the end
MsgBox("DONE")
'Output the results
Label1.Text = Result
End Sub
End Class
说实话,我真的无法深入了解如何在.NET Framework中实际实现这一点,因为我自己并没有详细了解它。 (我主要为.NET Framework 4.0
编程。Async
/ Await
在4.5中引入。但它可以在4.0中使用,也可以在Microsoft https://www.nuget.org/packages/Microsoft.Bcl.Async中使用扩展包。
然而实际使用情况并不像你所看到的那么难,所以我认为这是要走的路。