Geo*_*nov 8 .net c# design-patterns asynchronous .net-4.0
将异步调用转换为同步是否有任何良好的实践(模式)?
我有一个第三方库,其方法都是异步的,以获得任何方法的结果,你必须听一个事件,这将带来一些上下文.基本上它看起来像:
service.BeginSomething(...);
service.OnBeginSomethingCompleted += ;
Run Code Online (Sandbox Code Playgroud)
我需要的是在BeginSomething完成后执行一些代码(因此在触发OnBeginSomethingCompleted之后).在事件中处理响应非常不方便.
我能想到的唯一方法是运行Thread.Sleep循环并等待表单上的某个字段更新,但它看起来不是非常优雅的sollution.
我正在使用.net 4.0.
您可以继承主类并提供操作的同步版本.如果子类化不是一个选项,您可以创建一个扩展方法.这是事情的样子.
public class Subclass : BaseClass
{
public void Something()
{
using (var complete = new ManualResetEventSlim(false))
{
EventHandler handler = (sender, args) => { complete.Set(); };
base.OnBeginSomethingCompleted += handler;
try
{
base.BeginSomething();
complete.Wait();
}
finally
{
base.OnBeginSomethingCompleted -= handler;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
更新:
我应该指出的一点是,在某些情况下这可能会有问题.考虑这个例子.
var x = new Subclass();
x.BeginSomething();
x.Something();
Run Code Online (Sandbox Code Playgroud)
很明显,handlerin Something可以OnBeginSomethingCompleted从之前的呼叫中接收到该事件BeginSomething.确保你以某种方式防范这一点.