VB.NET调用后等待

时间:2014-08-05 20:21:16

标签: vb.net invoke

是否可以从"非主要"调用函数?线程然后在执行其余的之前等待它完成?

我可以在之前设置一个布尔值,然后使函数"翻转"它完成后布尔值为false,但我想知道是否有更简单/更专业的方法来实现这个目标?

由于

1 个答案:

答案 0 :(得分:2)

我想你希望保持你的表单响应,但你不想要调用额外的程序或类似的东西。 在这种情况下,AsyncAwait关键字可能是您的好方法:

这里详细解释http://msdn.microsoft.com/en-US/en-en/library/hh191443.aspx但我会简要介绍一下:

  • 您首先使用Async关键字声明方法。这可以是例如下面示例中处理按钮点击事件的方法。
  • 在此方法中,您可以从另一个被称为任务的方法获取结果,并使用await关键字将其分配给临时变量。
  • 在任务运行期间,将停止进一步执行代码。您的GUI保持敏感性。

以下是一个小例子(仅在Button上抛出LabelForm):

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中使用扩展包。
然而实际使用情况并不像你所看到的那么难,所以我认为这是要走的路。