我有这个代码做我想要的:
TriggerSomeExternalProcess();
double secondsElapsed = 0;
DateTime startTime = DateTime.UtcNow;
double timeoutInSeconds = 10;
while (secondsElapsed < timeoutInSeconds) {
// TODO: this seems bad...
secondsElapsed = DateTime.UtcNow.Subtract(startTime).TotalSeconds;
}
CheckStatusOfExternalProcess();
目标是TriggerSomeExternalProcess
然后CheckStatusOfSomeExternalProcess
- 但该进程在同一个线程上运行,因此我无法Thread.Sleep()
。这是一个无法等待的持续过程。
我觉得上面的while
循环是错误的 - 当你需要等待而不阻塞你的线程时,你采用了什么模式?
从其中一个答案的评论中复制粘贴 不幸的是我无法触及ExternalProcess中的代码。我正在编写测试,这些是我可以访问的方法。我知道这不太理想
答案 0 :(得分:2)
您可以将一个StatusChangedEvent添加到ExternalProcess事物上并将EventHandler附加到它上,而不是使用CheckStatusOfExternalProcess()方法。这样,当状态发生变化时,会调用eventhandler。
这对你有用吗?
顺便说一下:如果你的两个进程都在同一个线程上运行 - 那怎么可能没有阻塞?
答案 1 :(得分:0)
我认为外部的过程不是你自己的过程。 因此,它无法采取回调操作。 它无法发出心跳(定期发送它的当前状态)。 并且它无法订阅它的状态变化。 这些是处理它的正常方法。
在这种情况下你可以使用这样的东西
Task.delay(TimeSpan.FromSeconds(10))).ContinueWith(() => CheckStatusOfExternalProcess())
第一个任务完成后,继续将触发,但现在您可以继续使用代码而不必担心它