簡體   English   中英

在BackgroundWorker C#中啟動Process.Start

[英]Process.Start in BackgroundWorker C#

我遇到了最糟糕的時光,把我的頭纏在線程/后台進程上。 在某種程度上,我的問題似乎很普遍,但是我還沒有找到可以滿足我需求的好例子。

經典示例如下所示:
當某個長時間運行的任務/進程運行時,我的UI凍結-我希望至少能夠移動/最小化UI。

經典答復包括線程和任務工廠以及BackgroundWorker解決方案。 但是,無論我如何實施它們,我都會得到糟糕的結果。

在我的程序中,我正在執行另一個應用程序並等待其完成。 為了簡單起見,假設我這樣做是這樣的:

            Process p = Process.Start("notepad.exe somefile.txt");
            p.WaitForExit();
            //read somefile.txt

顯然,在WaitForExit()磨掉等待我關閉記事本時,我的應用程序UI將掛起。

我嘗試了一些建議的方法來解決這個問題,但是我陷入了兩個角落之一:

  1. 我的界面仍然掛起,然后在關閉記事本時讀取somefile.txt。
  2. 進程(記事本)運行良好,但我的應用程序在關閉記事本之前立即讀取somefile.txt(因此我猜它正在異步運行)

我看到的大多數示例都涉及大量計數-簡單但不完全是我正在做的事情。 取消此“外部”過程會使事情變得有些復雜。

感謝您的時間和考慮!!

BackgroundWorker在這里似乎很合適。 應該按照以下方式進行配置:

var worker = new BackgroundWorker();
worker.WorkerReportsProgress = false;
worker.WorkerSupportsCancellation = false;
worker.DoWork += worker_DoWork;
worker.RunWorkerCompleted += worker_RunWorkerCompleted;
worker.RunWorkerAsync();

然后有處理程序:

void worker_DoWork(object sender, DoWorkEventArgs e)
{
    //start notepad process here.
}

void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    //read somefile.txt here.
}

從事情的聲音來看,您的應用程序未在單獨的線程上運行Process.WaitForExit調用,否則不會掛起。

BackgroundWorkerThreadThreadPool都是有用的工具,但是使用它們並使其變得困難和麻煩,帶有System.Threading.Task的Task Parallel庫在某種程度上已“取代”了使用線程來直接執行您需要執行的大多數操作異步地。

請參閱: 線程和C#中的新Task庫

這樣您的代碼就變成了。

Task.Factory.StartNew(() =>
{
   var proc = new Process("...");
   proc.WaitForExit();
   File.Read("...");
});

暫無
暫無

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

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