如何等待异步调用完成?
问题描述:
假设我有两个事件A和B.他们每个人都引发异步调用,比如AsyncA和AsyncB。如何等待异步调用完成?
我想要的是:当A仅在AsyncB完成时调用AsyncA。
事件A和B按顺序依次触发:A,然后B. 我预计AsyncA在AsyncB完成之前完成,但实际上大部分时间,AsyncB在AsyncA之前完成。
我不能在AsyncA完成的事件中放置AsyncB调用。 如何确保AsyncB始终在AsyncA之后?
答
答
不能保证台异步调用的完成顺序,但你可以执行工作要在为了做你要。你需要的是一种同步的方式。
在OnAsyncA
您需要:
- 你需要做,如果有必要节省
OnAsyncB
所需的信息的工作。 - 设置等待手柄(例如ManualResetEvent或AutoResetEvent)。
在OnAsyncB
,
- 保存任何信息所需(例如,结果)。
- Spawn a threadpool thread。 (因为WCF回调发生在UI线程上,所以在处理程序中等待信号将是一个坏主意)。
在线程池线程,
- 等待句柄。
- 完成您通常为
OnAsyncB
所做的工作。
还有其他的变化,比如有一个更长的运行线程从“依赖事件”队列中出队,使用TPL等等。
记住要从线程池线程同步回UI线程。
你能解释为什么你不能在AsyncA完成的处理程序中调用AsyncB吗? –
+1这个经典问题。我想你必须让某个房间“以某种方式”在AsyncA完成的事件上调用AsyncB。 –
因为事件A和B被不同的地方从不同的理由解雇了。 – KentZhou