在异步方法中的超时



我有一个名为" requestMessage()"的异步方法。在此方法中,我将向消息代理发送消息。由于我不知道什么时候可以期待结果,因此我使用" TaskCompletionsource"。我希望异步方法终止,当回复消息到达时(我将收到经纪人的活动)。

到目前为止,这效果很好。现在,我的问题是永远无法回答此消息,或者至少可以迟到。

我正在寻找更改以实现自己的超时。为此,我尝试了一个计时器以及反应性扩展的观察者。问题始终是相同的 - 我无法获得主线程,并且计时器线程同步了,因为我使用.NET Core 2,并且没有SynchronizationContext。

所以,在我的代码中,有一个观察者。

        Observable
        .Interval(TimeSpan.FromSeconds(timeOutInSeconds))
        .Subscribe(
            x =>
            {
                timeoutCallback();
            });

如果时间到期,则应调用回调。在我的呼叫者方法中,我以这种方式处理回调:

    TimeoutDelegate timeoutHandler = () => throw new WorkcenterRepositoryCommunicationException("Broker communication timed out.", null);

您已经意识到,这个例外将永远不会被捕获,因为它不会抛向主线程。

如何在这里同步线程?

预先感谢!

"在某些问题上失败"的最佳方法是抛出适当的例外,但是您绝对可以使用返回;如果您希望避免例外。

这将创建一个同步完成的完整/故障任务,因此使用的呼叫者等待完成任务并继续使用相同的线程。

取消token可以允许呼叫者取消操作,这不是您描述的情况。task.yield不会终止任何操作,它只能使其他任务运行一段时间,然后重新安排本身。

相关内容

  • 没有找到相关文章

最新更新