我让这个代码做我想做的事:
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中的代码。我正在写一个测试,这些都是我可以使用的方法。我知道这不太理想
发布于 2017-02-16 17:41:14
与使用CheckStatusOfExternalProcess()方法不同,您可以将一个StatusChangedEvent添加到ExternalProcess上,并将一个EventHandler附加到它上。这样,当状态发生变化时,您的晚间管理员就会被调用。
这对你来说有可能吗?
顺便说一句:如果两个进程运行在同一个线程上,那怎么可能不阻塞呢?
发布于 2017-02-16 17:51:10
我假设外部的过程不是你自己的。因此,它不能采取回调操作。它不能发出心跳(定期发回它的当前状态)。它也不能接受它的状态改变。这将是处理这个问题的正常方法。
在这种情况下,你只需要这样的东西
Task.delay(TimeSpan.FromSeconds(10))).ContinueWith(() => CheckStatusOfExternalProcess())一旦第一个任务完成,就会继续使用will触发器,但是现在您可以继续编写代码,而不必担心它了。
https://stackoverflow.com/questions/42281036
复制相似问题