等待结果而不阻塞线程

时间:2017-02-16 17:37:33

标签: c# multithreading asynchronous synchronization

我有这个代码做我想要的:

        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中的代码。我正在编写测试,这些是我可以访问的方法。我知道这不太理想

2 个答案:

答案 0 :(得分:2)

您可以将一个StatusChangedEvent添加到ExternalProcess事物上并将EventHandler附加到它上,而不是使用CheckStatusOfExternalProcess()方法。这样,当状态发生变化时,会调用eventhandler。

这对你有用吗?

顺便说一下:如果你的两个进程都在同一个线程上运行 - 那怎么可能没有阻塞?

答案 1 :(得分:0)

我认为外部的过程不是你自己的过程。 因此,它无法采取回调操作。 它无法发出心跳(定期发送它的当前状态)。 并且它无法订阅它的状态变化。 这些是处理它的正常方法。

在这种情况下你可以使用这样的东西

Task.delay(TimeSpan.FromSeconds(10))).ContinueWith(() => CheckStatusOfExternalProcess())
第一个任务完成后,

继续将触发,但现在您可以继续使用代码而不必担心它