0

我最糟糕的时间是围绕线程/后台进程。我的问题在某种程度上似乎很常见,但我还没有找到满足我需求的好例子。

经典的例子是这样的:
当某个长时间运行的任务/进程运行时,我的 UI 冻结 - 我希望至少能够移动/最小化 UI。

经典回复包括线程和任务工厂以及 BackgroundWorker 解决方案。但无论我如何实施它们,我都会得到糟糕的结果。

在我的程序中,我正在执行另一个应用程序并等待它完成。为了简单起见,假设我这样做:

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

WaitForExit()显然,我的应用程序 UI 在等待我关闭记事本时会挂起。

我已经尝试了一些建议的方法,但我被画在两个角落之一:

  1. 我的界面仍然挂起,然后在我关闭记事本时读取 somefile.txt 就好了。
  2. 进程(记事本)运行良好,但我的应用程序在我关闭记事本之前立即读取了 somefile.txt(所以我猜它是异步运行的)

我看到的大多数例子都涉及到一个很大的数字 - 简单但不是我正在做的事情。启动这个“外部”过程会使事情变得有点复杂。

感谢您的时间和考虑!!

4

2 回答 2

1

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.
}
于 2013-04-06T19:17:29.813 回答
0

从事物的声音来看,您的应用程序没有Process.WaitForExit在单独的线程上运行调用,否则不会有任何挂起。

BackgroundWorkerThread并且这些ThreadPool都是有用的工具,但是它们可能很难使用并且很难正确使用,Task Parallel LibrarySystem.Threading.Task已经在某种程度上“取代”了直接使用线程来处理您需要异步执行的大多数操作。

请参阅:线程和 C# 中的新任务库

所以你的代码变成了。

Task.Factory.StartNew(() =>
{
   var proc = new Process("...");
   proc.WaitForExit();
   File.Read("...");
});
于 2013-04-06T18:50:08.897 回答