Vb.net 需要异步执行powershell脚本的方法吗

Vb.net 需要异步执行powershell脚本的方法吗,vb.net,multithreading,visual-studio,powershell,async-await,Vb.net,Multithreading,Visual Studio,Powershell,Async Await,在Windows 7 PC上,我正在使用 Visual Studio 2015企业版 VB.net .Net Framework 4.5.2 PowerShell 5.0 该应用程序涉及多线程,因为它有一个嵌入式PowerShell脚本,需要相当长的时间才能运行。此处嵌入意味着fillListOfStringVarAsync()函数(如下所示)使用PowerShell脚本文本构建字符串变量。第二个线程运行fillListOfStringVarAsync(),主线程将此函数返回的数据放在主窗体

在Windows 7 PC上,我正在使用

  • Visual Studio 2015企业版
  • VB.net
  • .Net Framework 4.5.2
  • PowerShell 5.0
该应用程序涉及多线程,因为它有一个嵌入式PowerShell脚本,需要相当长的时间才能运行。此处嵌入意味着
fillListOfStringVarAsync()
函数(如下所示)使用PowerShell脚本文本构建字符串变量。第二个线程运行
fillListOfStringVarAsync()
,主线程将此函数返回的数据放在主窗体控件上。我首先使用了BackgroundWorker方法,使用了嫁妆处理程序等。这非常有效。然后我读到了新的异步/等待方法;我用async/await重建了所有东西,结果遇到了麻烦。这个样本

导入System.Management.Automation
公开课演示
私有异步子表单加载(发送方作为对象,e作为事件参数)处理MyBase.Load
"一些说法,
Dim listOfStringVar As List(字符串的)=等待FILLLISTOFSTRINGVARANCY()
“一些使用
'
'listOfStringVar
'
"价值",
端接头
私有异步函数fillListOfStringVarAsync()作为任务(列表(字符串))
Dim scriptText As String=“#PowerShell 5.0脚本,已知可用”
Dim stringListVar作为新列表(字符串)
Dim psInstance As PowerShell=PowerShell.Create().AddScript(脚本文本)
Dim async As IAsyncResult=psInstance.BeginInvoke()'等待在此处不起作用
对于psInstance.EndInvoke(异步)中作为PSObject的每个obj,“等待”在这里不起作用
stringListVar.Add(对象ToString)
下一个
返回stringListVar
端函数
末级
显示了重建的基本工程设计,带有async/await。问题:在
fillListOfStringVarAsync()
函数中,包含PowerShell脚本的psInstance对象需要一个等待表达式,但我不知道正确的语法。Visual Studio绿色在函数名
fillListOfStringVarAsync()
下加下划线,并警告

此异步方法缺少“Await”运算符,因此将异步运行等

应用程序进行编译,但在
fillListOfStringVarAsync()
中没有wait操作符,主窗体将消失,直到次线程完成并返回其数据。而且,这两个来自微软的公司都给我带来了最接近的机会。我到处都找了,但运气不好。

你可以用 等待任务。运行(()=>YourMethod())

但我不确定这是否会有帮助。至少在web应用程序中,等待仍然会阻止表单显示,直到异步方法完成。

您可以使用 等待任务。运行(()=>YourMethod())


但我不确定这是否会有帮助。至少在web应用程序中,等待仍然会阻止表单显示,直到异步方法完成。

一般来说,您应该执行回调函数,并在表单加载中删除等待。。。但是wait基本上停止了您的加载。您正在以Form_load的形式等待调用,那么您不应该在调用堆栈中更深层地等待它。其要点是能够从UI线程调用长时间运行的操作,但不能阻止UI。就这样。第一个等待生成一个非UI线程,因此您不需要等待来自该线程的另一个调用。您可以在这一点上利用多线程,但使用不同的工具,例如。
我第一次使用BackgroundWorker方法,使用DoWork处理程序等。这非常有效。然后我读到了更新的async/await方法…
我还必须说,您有一些东西工作得很好,为什么要更改它呢?多亏了你们两位。你的建议和哈蒙先生的建议都很好。BackgroundWorker机器与async相比非常复杂,因此即使BW工作得很好,async也工作得更好。一般来说,您应该执行回调函数,并消除表单加载中的等待。。。但是wait基本上停止了您的加载。您正在以Form_load的形式等待调用,那么您不应该在调用堆栈中更深层地等待它。其要点是能够从UI线程调用长时间运行的操作,但不能阻止UI。就这样。第一个等待生成一个非UI线程,因此您不需要等待来自该线程的另一个调用。您可以在这一点上利用多线程,但使用不同的工具,例如。
我第一次使用BackgroundWorker方法,使用DoWork处理程序等。这非常有效。然后我读到了更新的async/await方法…
我还必须说,您有一些东西工作得很好,为什么要更改它呢?多亏了你们两位。你的建议和哈蒙先生的建议都很好。BackgroundWorker机器与async相比非常复杂,因此即使BW工作得很好,async也工作得更好。谢谢!我按照您的建议更改了函数调用,并取消了fillListOfStringVarAsync()中的所有async/Wait内容。成功了!你是绝地武士。非常感谢。我按照您的建议更改了函数调用,并取消了fillListOfStringVarAsync()中的所有async/Wait内容。成功了!你是绝地武士。