【发布时间】:2013-04-06 18:43:26
【问题描述】:
我最糟糕的时间是围绕线程/后台进程。我的问题在某种程度上似乎很常见,但我还没有找到满足我需求的好例子。
经典的例子是这样的:
当某个长时间运行的任务/进程运行时,我的 UI 会冻结 - 我希望至少能够移动/最小化 UI。
经典回复包括线程和任务工厂以及 BackgroundWorker 解决方案。 但无论我如何实现它们,我都会得到糟糕的结果。
在我的程序中,我正在执行另一个应用程序并等待它完成。为了简单起见,假设我这样做:
Process p = Process.Start("notepad.exe somefile.txt");
p.WaitForExit();
//read somefile.txt
很明显,当WaitForExit() 等待我关闭记事本时,我的应用程序 UI 会挂起。
我已经尝试了一些建议的方法来解决这个问题,但我被画到了两个角落之一:
- 我的界面仍然挂起,然后在我关闭记事本时读取 somefile.txt 就好了。
- 进程(记事本)运行良好,但我的应用程序在我关闭记事本之前立即读取 somefile.txt(所以我猜它是异步运行的)
我看到的大多数例子都涉及到一个很大的数字 - 简单但不是我正在做的事情。启动这个“外部”过程会使事情变得有点复杂。
感谢您的时间和考虑!!
【问题讨论】:
-
如果您在后台线程上执行此操作,那么您的 UI 将不会挂起,因为您正在等待其他线程而不是 UI 线程。
-
您需要显示其余代码,显示将启动记事本的最小程序,使用后台工作程序,但仍然挂起。
-
您是否尝试过使用 BackgroundWorker 并在 worker 的 AfterCompleted 处理程序中读取 somefile.txt?
-
Rohit 你是对的,UI 没有挂起,但应用程序继续运行,就好像“somefile.txt”被编辑一样。我需要能够在后台进程运行时与 UI 交互(将其移开),但在进程完成之前不能“继续”。对不起,如果那是模糊的
-
您应该考虑使用msdn.microsoft.com/en-us/library/…(在文件更改时处理事件)而不是使用WaitForExit。
标签: c# multithreading process waitforexit