1

异步 CTP 非常好用。我看到了一些 windows phone 的例子,都使用:
(Assembly 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();

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

4

2 回答 2

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.

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

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

于 2012-10-12T18:11:53.723 回答
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感兴趣- 不幸的是,WP7 仍然停留在“今天”模式。现在 VS2012 出来了,Async CTP 可能很快就会被放弃。

于 2012-10-12T20:51:15.397 回答