我有一个名为" 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不会终止任何操作,它只能使其他任务运行一段时间,然后重新安排本身。