我有第三方服务,它具有异步DoAsync()操作和Done()事件。如何创建自己的同步DoSync()操作? 我想要这样的smth(伪代码):
operation DoSync()
{
DoAsync();
wait until Done();
}
答案 0 :(得分:2)
尝试使用AutoResetEvent http://msdn.microsoft.com/en-us/library/system.threading.autoresetevent.aspx
答案 1 :(得分:1)
执行此操作的一种方法是临时添加事件处理程序,并在该处理程序中设置某种可等待的对象。以下是使用WebClient
using System;
using System.Net;
using System.Threading;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
WebClient w = new WebClient();
using (var waiter = new ManualResetEventSlim())
{
DownloadDataCompletedEventHandler h = (sender, e) =>
{
if (e.Error != null)
{
Console.WriteLine(e.Error);
}
waiter.Set();
};
w.DownloadDataCompleted += h;
try
{
w.DownloadDataAsync(new Uri("http://www.interact-sw.co.uk/iangblog/"));
Console.WriteLine("Downloading");
waiter.Wait();
Console.WriteLine("Finished!");
}
finally
{
w.DownloadDataCompleted -= h;
}
}
}
}
}
这是一个简化的版本,它使基本技术更容易看到,但它不会对错误处理或整理后的内容感到烦恼:
WebClient w = new WebClient();
using (var waiter = new ManualResetEventSlim())
{
w.DownloadDataCompleted += delegate { waiter.Set(); };
w.DownloadDataAsync(new Uri("http://www.interact-sw.co.uk/iangblog/"));
Console.WriteLine("Downloading");
waiter.Wait();
Console.WriteLine("Finished!");
}
在大多数情况下,您需要确保检测到错误,并在完成后分离处理程序 - 我只是提供了较短的版本来帮助说明这一点。我真的不会在真正的程序中使用那个简化版。