我有一個 VB 函式,它將程式作為行程啟動并等待它完成。如果沒問題,它會通過回傳碼 0,否則會通過 8。問題是它阻塞了 WPF UI 執行緒,并可能導致 Not Enough Quota 崩潰,因為執行緒被阻塞的時間太長。
所以我試圖讓它異步運行,這樣 UI 執行緒就不會被阻塞。不幸的是,我有很多行 VB 代碼,但是這些天各種網站上的所有示例都是 C#,我沒有編程,而且我有太多代碼來嘗試學習 C# 來轉換它。
我試過 Await Task.Run 不接受引數。我暫時洗掉了 Pgm 引數并硬編碼了程式名稱,然后它將編譯并作業。我意識到我可以改用全域變數,但這似乎不是一個好習慣。
TaskFactory 似乎允許引數,但是當我在 StartNew 上等待時,控制元件立即回傳,因為 StartNew 創建了一個外部任務和一個內部任務,而 Await 只等待初始的外部任務。我發現的 AC# 解決方案建議使用 Await Await Task 但我似乎無法將其轉換為 VB 將接受的語法。
任何關于如何等待 Startit 完成的幫助將不勝感激。我在 Windows 10 下使用 .Net 6 和 VS 2022。
請原諒任何格式錯誤。這是我在 Stack Overflow 的第一天
編碼
Class MainWindow
Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
Call StartitAsync()
MsgBox("Returned from StartitAsync")
End Sub
Private Async Function StartitAsync() As Task(Of Integer)
Dim Startup As Func(Of String, Integer) = AddressOf Startit
Dim tf As New TaskFactory
Dim Rc As Integer = Await tf.StartNew(Startup, "notepad.exe")
MsgBox("Returned from await of Startit, RC is " & Rc)
Return Rc
End Function
Private Function Startit(Pgm As String) As Integer
Dim RC As Integer
Dim Startinfo As New ProcessStartInfo
MsgBox("Pgm is " & Pgm)
Startinfo.WindowStyle = ProcessWindowStyle.Maximized ' Display in a maximised window
Startinfo.FileName = Pgm
Startinfo.Arguments = ""
Using PgmProcess As Process = Process.Start(startInfo:=Startinfo) ' Start the program
PgmProcess.WaitForExit() ' Wait until it ends
If PgmProcess.HasExited = True Then ' If the process has exited
RC = PgmProcess.ExitCode ' Save the exit code
Else
RC = 8
End If
End Using
Return RC
End Function
uj5u.com熱心網友回復:
您應該使用Task.Run代替Task.Factory.StartNew(或(new TaskFactory()).StartNew)。對于 C# 和 VB.NET 都是如此。
我的 VB 非常生銹,但我相信這就是你要找的:
Private Async Function StartitAsync() As Task(Of Integer)
Dim Startup = Function() Startit("notepad.exe")
Dim Rc As Integer = Await Task.Run(Startup)
MsgBox("Returned from await of Startit, RC is " & Rc)
Return Rc
End Function
這使用lambda 運算式,這在使用 API 時非常有用,例如Task.Run.
旁注:您不應該MsgBox從Startit. 由于在執行緒池上Task.Run執行Startit,它不應訪問任何 UI 元素(或執行顯示訊息框之類的操作)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/503723.html
