在Windows 7 PC上,我正在使用
构建Windows窗体应用程序该应用程序涉及多线程,因为它具有嵌入式PowerShell脚本,需要相当长的时间才能运行。这里嵌入意味着fillListOfStringVarAsync()
函数(如下所示)使用PowerShell脚本文本构建字符串变量。第二个线程运行fillListOfStringVarAsync()
,主线程将来自此函数的返回数据放在主窗体控件上。我首先使用BackgroundWorker方法,使用DoWork处理程序等。这非常有效。然后我读到了关于更新的异步/等待方法;我使用async / await重建了所有东西,然后我撞墙了。这个样本
Imports System.Management.Automation
Public Class demo
Private Async Sub form_Load(sender As Object, e As EventArgs) Handles MyBase.Load
' Some statements
Dim listOfStringVar As List(Of String) = Await fillListOfStringVarAsync()
' Some statements that use the
'
' listOfStringVar
'
' value
End Sub
Private Async Function fillListOfStringVarAsync() As Task(Of List(Of String))
Dim scriptText As String = "#PowerShell 5.0 script, known to work"
Dim stringListVar As New List(Of String)
Dim psInstance As PowerShell = PowerShell.Create().AddScript(scriptText)
Dim async As IAsyncResult = psInstance.BeginInvoke() 'await won't work here
For Each obj As PSObject In psInstance.EndInvoke(async) 'await won't work here
stringListVar.Add(obj.ToString)
Next
Return stringListVar
End Function
End Class
显示了使用async / await进行重建的基本工程。问题:在fillListOfStringVarAsync()
函数内部,psInstance对象 - 具有PowerShell脚本 - 需要await表达式,但我不知道这个的正确语法。 Visual Studio绿色 - 为函数名称fillListOfStringVarAsync()
添加一个警告
这种异步方法缺少“Await”运算符,因此会异步运行等等。
应用程序编译,但如果没有fillListOfStringVarAsync()
中的await运算符,主表单将消失,直到辅助线程完成并返回其数据。来自微软的This page和this page让我最接近。我看着StackOverflow,但没有运气。
答案 0 :(得分:0)
你可以使用 等待Task.Run(()=> YourMethod());
我不确定这会有所帮助。至少在Web应用程序中,等待仍然会阻止您的表单显示,直到异步方法完成。