如何在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
然后你可以这样做:
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很可能会被放弃。