【发布时间】:2020-07-05 18:34:31
【问题描述】:
假设我们有这样的代码:
public class MyProcess
{
private Process _process;
public event EventHandler OnFinish;
public MyProcess(string pathToExe)
{
_process = new Process();
_process.StartInfo.FileName = pathToExe;
}
public int Start()
{
_process.Exited += _processExited;
_process.Start();
return _process.Id;
}
public void Stop()
{
_process.Stop();
}
private void _processExited(object sender, EventArgs e)
{
OnFinish?.Invoke();
}
}
public class MyProgram
{
private static int stoppedProcs = 0;
public static void Main(string[] args)
{
var proc = new MyProcess("foo.exe");
proc.OnFinish += proc_OnFinish;
proc.Start();
proc.Stop();
//Wait here to display 1 instead of 0
Console.WriteLine(stoppedProcs);
}
private static void proc_OnFinish(object sender, EventArgs e)
{
stoppedProcs++;
}
}
我创建并启动进程。然后我想停止它并仅在处理完事件后继续。问题是我不会自己调用事件,因为它是由操作系统完成的。如何理解事件处理程序已完成?
【问题讨论】:
-
你的
Process是System.Diagnostics.Process吗?我在System.Diagnostics.Process中找不到Stop。 -
如果您想坚持事件模式,请查看ManualResetEvent 或ManualResetEventSlim。不过,您也可以切换到基于任务的异步 (TAP)。
-
@LouisGo 是的。我的错误,我使用 Kill()
-
@LouisGo 我不明白我可以在这里等待什么。我不调用异步方法。我杀死了一个进程,操作系统发出该进程退出的信号,然后调用处理程序
-
@Alexander 抱歉,Fildor 的建议更适合您的情况,我将删除我的评论以防止混淆。
标签: c# .net multithreading events