如何在VS 2010 for WP7中使用async-await和WCF?

Async CTP非常好用。 我看到了一些Windows手机的例子,全部使用:
(程序集AsyncCtpLibrary_Phone.dll,v2.0.50727,AsyncCtpExtensions)。

var client = new WebClient(); string data = await client.DownloadStringTaskAsync(new Uri(url)); 

或类似上面的代码。

如何使用async / await方法为我的服务? (WCF)
今天所有方法都是这样工作的:

  service.MyRequestCompleted += service_myRequestCompleted; service.MyRequestAsync(); 

我找不到一种方法来使用服务的扩展方法。

不幸的是,我没有找到一个很好的方法来概括这个任何事件,但它很容易适应特定事件:

 public static Task WhenRequestCompleted(MyService service) //can make it an extension method if you want. { TaskCompletionSource tcs = new TaskCompletionSource(); service.MyRequestCompleted += () => //change parameter list to fit the event's delegate { tcs.SetResult(null); }; service.MyRequestAsync(); return tcs.Task; } 

然后你可以这样做:

 await WhenRequestCompleted(service); //code that runs after the request is completed. 

我假设您在这里看到了模式,因此您可以对其进行调整,以便它可以与其他类型的其他事件一起使用。

哦,如果事件具有对你特别重要的参数,那么你可以让它返回一个Task而不是一个Task而不是使用tcs.SetResult(null)你可以使用lambda的一个参数来设置结果。

自从我使用WP7以来已经有一段时间了,所以我假设客户端代理为每个合同方法都有EAP端点( *Async + *Completed )和APM端点( Begin* + End* )。

如果这是正确的,那么您可以使用TaskFactory.FromAsync来包装Begin* / End*方法,如下所示:

 [ServiceContract] public interface ICalculator { [OperationContract] uint Divide(uint numerator, uint denominator); } static class Program { // Wrap those Begin/End methods into a Task-based API. public static Task DivideAsyncTask(this CalculatorClient client, uint numerator, uint denominator) { return Task.Factory.FromAsync(client.BeginDivide, client.EndDivide, numerator, denominator, null); } static async Task CallCalculator() { var proxy = new CalculatorClient(); var task = proxy.DivideAsyncTask(10, 5); var result = await task; Console.WriteLine("Result: " + result); } static void Main(string[] args) { try { CallCalculator().Wait(); } catch (Exception ex) { Console.Error.WriteLine(ex); } Console.ReadKey(); } } 

您可能对我今天和明天的异步WCF的一篇博文感兴趣 – 不幸的是,WP7仍处于“今天”模式。 现在,VS2012出局后,Async CTP很可能会被放弃。