我在WCF服务中有一个异步方法,以及使用此方法的客户端。当我调用该方法时,客户端的GUI将被阻止,直到异步方法完成。我的代码如下:
SERVICE
public IAsyncResult BeginAsyncMethod(CustomClass paramCustomClass, AsyncCallback callback, object state)
{
Task<bool> task = Task<bool>.Factory.StartNew(p => slowMethod(paramCustomClass, state);
return task.ContinueWith(res => callback(task));
}
public bool EndAsyncMethod(IAsyncResult paramResult)
{
return ((Task<bool>)paramResult).Result;
}
slowMethod是一个虚拟方法,其中for为i = 0到1000000000。
客户端
private void callAsyncMethod()
{
Task<bool> task = Task<bool>.Factory.FromAsync(_proxy.Proxy.BeginAsyncMethod, _proxy.Proxy.EndAsyncMethod, CustomClass, null);
bool hasFinished= task.Result;
}
在客户端中,我有一个调用callAsyncMethod的按钮,当我单击该按钮时,在slowMethod运行时,GUI会变得臃肿。
如果我没有错,async方法会将控件返回给调用者,以避免程序被阻止,但在我的情况下,这不会发生。我误解了什么吗?我以错误的方式使用异步方法?
感谢。 Daimroc。
答案 0 :(得分:2)
即使方法是异步的,您也在等待结果返回,从而有效地阻塞调用线程(UI)。当您访问Result
对象的Task
属性时,如果任务尚未完成,它将一直阻塞,直到结果可用。
您应该异步调用异步方法。如果您使用的是.NET 4.5,则可以使用await关键字:
private async void callAsyncMethod()
{
Task<bool> task = Task<bool>.Factory.FromAsync(_proxy.Proxy.BeginAsyncMethod, _proxy.Proxy.EndAsyncMethod, CustomClass, null);
bool hasFinished = await task;
}
否则你真的需要使调用异步
private void callAsyncMethod() {
_proxy.Proxy.BeginAsyncMethod(CustomClass, null, MyCallback, _proxy);
}
private void MyCallback(IAsyncResult asyncResult) {
bool hasFinished = _proxy.Proxy.EndAsyncMethod(asyncResult);
}