异步方法超时

时间:2017-12-07 09:29:34

标签: c# asynchronous async-await timeout asp.net-core-2.0

我有一个名为" 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);

正如您已经意识到的那样,此异常永远不会被捕获,因为它不会被抛到主线程。

我如何在这里同步线程?

提前致谢!

1 个答案:

答案 0 :(得分:0)

在某些问题上失败的最好方法"恕我直言将抛出相应的异常,但你绝对可以使用return;如果你愿意避免例外。

这将创建一个同步完成的已完成/故障任务,因此使用await的调用者将获得完成的任务并继续使用相同的线程。

CancellationToken允许调用者取消操作,这不是您描述的情况。 Task.Yield不会终止任何操作,只是让其他任务运行一段时间并重新安排自己以供日后使用。