我有一个名为" RequestMessage()"的异步方法。在这种方法中,我将向消息代理发送消息。由于我不知道何时会得到结果,因此我使用" TaskCompletionSource"。我希望async方法终止,当回复消息到达时(我将从代理接收事件)。
到目前为止,此工作正常。现在,我的问题是,这条消息永远无法回答,或者至少要迟到。
我正在寻找改变以实现我自己的超时。为此,我尝试了一个Timer,以及Reactive Extensions的Observer。问题总是一样的 - 我不能让我的主线程和计时器线程同步,因为我使用.NET Core 2并且没有SynchronizationContext。
所以,在我的代码中有一个观察者..
Observable
.Interval(TimeSpan.FromSeconds(timeOutInSeconds))
.Subscribe(
x =>
{
timeoutCallback();
});
如果时间到期,则应调用回调。在我的调用方法中,我以这种方式处理回调:
TimeoutDelegate timeoutHandler = () => throw new WorkcenterRepositoryCommunicationException("Broker communication timed out.", null);
正如您已经意识到的那样,此异常永远不会被捕获,因为它不会被抛到主线程。
我如何在这里同步线程?
提前致谢!
答案 0 :(得分:0)
在某些问题上失败的最好方法"恕我直言将抛出相应的异常,但你绝对可以使用return;如果你愿意避免例外。
这将创建一个同步完成的已完成/故障任务,因此使用await的调用者将获得完成的任务并继续使用相同的线程。
CancellationToken允许调用者取消操作,这不是您描述的情况。 Task.Yield不会终止任何操作,只是让其他任务运行一段时间并重新安排自己以供日后使用。