需要一种异步执行powershell脚本的方法

时间:2017-03-23 20:28:10

标签: vb.net multithreading visual-studio powershell async-await

在Windows 7 PC上,我正在使用

构建Windows窗体应用程序
  • Visual Studio 2015 Enterprise
  • VB.net
  • .Net Framework 4.5.2
  • PowerShell 5.0

该应用程序涉及多线程,因为它具有嵌入式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 pagethis page让我最接近。我看着StackOverflow,但没有运气。

1 个答案:

答案 0 :(得分:0)

你可以使用     等待Task.Run(()=> YourMethod());

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