【发布时间】:2020-01-17 07:37:28
【问题描述】:
我有一个同步调用方法的事件处理程序。
void OnSomeEventHappened(int eventInfo)
{
MethodDoingSomething(eventInfo);
}
我想更改此事件处理程序,以便方法调用(对 MethodDoingSomething)变为异步。
问题是 MethodDoingSomething 可能会抛出异常,重要的是在新的异步行为中,这些异常会继续从运行事件处理程序的线程中抛出(即,用于接收异常的原始线程)同步情况)。
我还需要按照它们到达的顺序执行调用。
我的做法是使用阻塞集合来实现一个FIFO任务队列。
void OnSomeEventHappened(int eventInfo)
{
_blockingCollectionFifoQueue.Add(eventInfo);
}
并且有一个调用原始方法的阻塞集合的消费者:
void RunConsumer()
{
foreach (var elem in _blockingCollectionFifoQueue.GetConsumingEnumerable())
{
MethodDoingSomething(elem);
}
}
在那种情况下,我如何获取可能从 MethodDoingSomething 引发的异常,并在主线程中重新引发它们,就像之前代码同步时一样。
【问题讨论】:
标签: c# multithreading asynchronous exception blockingcollection