首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >等待结果而不阻塞线程

等待结果而不阻塞线程
EN

Stack Overflow用户
提问于 2017-02-16 17:37:32
回答 2查看 459关注 0票数 2

我让这个代码做我想做的事:

代码语言:javascript
运行
复制
        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中的代码。我正在写一个测试,这些都是我可以使用的方法。我知道这不太理想

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-16 17:41:14

与使用CheckStatusOfExternalProcess()方法不同,您可以将一个StatusChangedEvent添加到ExternalProcess上,并将一个EventHandler附加到它上。这样,当状态发生变化时,您的晚间管理员就会被调用。

这对你来说有可能吗?

顺便说一句:如果两个进程运行在同一个线程上,那怎么可能不阻塞呢?

票数 2
EN

Stack Overflow用户

发布于 2017-02-16 17:51:10

我假设外部的过程不是你自己的。因此,它不能采取回调操作。它不能发出心跳(定期发回它的当前状态)。它也不能接受它的状态改变。这将是处理这个问题的正常方法。

在这种情况下,你只需要这样的东西

代码语言:javascript
运行
复制
Task.delay(TimeSpan.FromSeconds(10))).ContinueWith(() => CheckStatusOfExternalProcess())

一旦第一个任务完成,就会继续使用will触发器,但是现在您可以继续编写代码,而不必担心它了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42281036

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档