Vyk*_*tor 6 c# io synchronization multiple-processes
我有应用程序启动子进程并stdout异步处理它.问题是异步操作需要一些时间,我希望负责进程执行的方法在所有异步IO操作完成后结束.
我有这样的代码:
using System.Diagnostics;
Process process = new Process();
// ...
process.OutputDataReceived += new DataReceivedEventHandler(this.OnRecvStdOut);
process.ErrorDataReceived += new DataReceivedEventHandler(this.OnRecvStdErr);
// ...
process.Start();
process.BeginOutputReadLine();
process.BeginErrorReadLine();
// ...
process.WaitForExit();
Run Code Online (Sandbox Code Playgroud)
现在我正在寻找一种方法告诉程序等待所有IO(OnRecvStdOut)操作完成.
我虽然使用了System.Threading类中的一个,但我不确定哪个类最适合这个以及如何执行此操作,最好的方法可能是:
public void OnRecvStdOut(...)
{
something.Increase();
// the stuff that takes so long
something.DecreaseAndSignal();
}
Run Code Online (Sandbox Code Playgroud)
并在主要功能:
something.WaitUntilZero();
Run Code Online (Sandbox Code Playgroud)
注:我想同时允许StdErr和StdOut并行处理. Something不能依赖那个Wait会被调用的Signal,因为Increase()和DecreaseAndSignal()对会在Wait发生之前被多次调用.
我想到的第二件事就是可以多次发出信号(无需处理信号)并在主函数中使用循环,如:
while( ioOperations > 0){
something.WaitForSignal(500);
}
Run Code Online (Sandbox Code Playgroud)
我想出了这个似乎有用的东西:
using System.Threading;
protected int IOCount = 0;
protected AutoResetEvent _IOSyncEvent = new AutoResetEvent(false);
public void OnRecvStdOut(...)
{
Interlocked.Increase( ref IOCount);
// the stuff that takes so long
Interlocked.Decrease( ref IOCount);
IOSyncEvent.Set();
}
// After process.WaitForExit()
while( IOCount > 0){
// 250 for a case that signal occurs after condition and before wait
IOSyncEvent.WaitOne(250);
}
Run Code Online (Sandbox Code Playgroud)
但是我会感谢任何注意事项如何做到这一点"良好实践方式"或者实施的可能风险.
使用CountdownEvent设置为 2。每个收到数据的回调,检查 x.EndOfStream 标志(其中 x 是流程对象上的标准输出或标准错误)。如果 EOF,则发出倒计时事件信号。它会起作用,因为标准输出流和错误输出流最终都会发出事件信号。一旦两者都发出信号,等待就会返回。这也是一种非常有效的方法。
| 归档时间: |
|
| 查看次数: |
718 次 |
| 最近记录: |