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

时间:2012-10-12 18:03:33

标签: c# wcf windows-phone-7.1 async-await

异步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();

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

2 个答案:

答案 0 :(得分:4)

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

public static Task WhenRequestCompleted(MyService service) //can make it an extension method if you want.
{
    TaskCompletionSource<object> tcs = new TaskCompletionSource<object>();

    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<T>而不是Task,而不是使用tcs.SetResult(null),您可以使用一个用于设置结果的lambda参数。

答案 1 :(得分:0)

自从我使用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<uint> DivideAsyncTask(this CalculatorClient client,
      uint numerator, uint denominator)
  {
    return Task<uint>.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();
  }
}

您可能对我的一篇博文async WCF today and tomorrow感兴趣 - 不幸的是,WP7仍处于“今日”模式。在VS2012出局的情况下,Async CTP可能很快就会被放弃。