簡體   English   中英

如何循環運行進程並等待它完成然后在 C# 中再次運行它而不凍結 GUI

[英]How to run a process in loop and wait for it to complete and then run it again in C# without freezing GUI

我是 C# 編程的新手,有一段代碼我想在循環中多次運行命令行進程。 我還想等待命令行過程完成,然后使用不同的 arguments 再次運行它。 我所做的是我在一個循環中定義了該過程,並且一切正常。 但是,我也想在每次進程結束時更新 GUI 上的進度條,但最終 Process.WaitForExit() 掛起我的 GUI 並且它不會更新進度條。 當 for 循環完成時,進度條會更新。 請幫幫我,這是我一直在嘗試做的。

ProcessStartInfo processInfox = new ProcessStartInfo();
processInfox.CreateNoWindow = false;
processInfox.UseShellExecute = false;
processInfox.FileName = programPath;
processInfox.CreateNoWindow = true;

int startFrames = Convert.ToInt16(txtStartFrame.Text);
int endFrames = Convert.ToInt16(txtEndFrame.Text);

for (int i = startFrames; i <= endFrames; i++)
{
    progressBar1.Value = (i / endFrames) * 100;
    iName = fileFrames + "_" + i + ".jpg";
    oName = outFrames + "\\" + outFileName + "_processed_" + i + ".jpg" ; 
    processInfox.Arguments = "-i \"" + iName + "\"" + progArgs + " -o \"" + oName + "\"";
    using (Process processFire = Process.Start(processInfox))
    {
        processFire.WaitForExit();
    }
}
  1. Process 公開了一個名為Exited的事件,您可以訂閱它。 不要忘記將EnableRaisingEvents屬性設置為true 訂閱應在流程Start之前完成。
  2. 一個進程可以被凍結,所以出口永遠不會觸發。 為了克服這個問題,您可以使用timeout & kill 模式 WaitForExit 接受一個 int ,它是以毫秒為單位的超時。 然后你必須檢查HasExited屬性,如果它是false則調用Kill方法。
  3. 根據您的要求,您可以使用后台線程來跨越一個進程。 您可以使用new Thread或使用ThreadPool.QueueUserWorkItem或使用Task.Run或...

將循環放入一些 function (我們稱之為foo )並使用await Task.Run(foo)運行在后台線程中運行進程的代碼,同時不阻塞 GUI 線程。

異步/等待

任務運行()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM