异步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();
我找不到使用服务扩展方法的方法。
答案 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可能很快就会被放弃。