想知道是否有人能告诉我哪里出错了。 我在我的wpf应用程序VS2012中添加了一个服务引用
然而我在Async调用上的等待是阻塞,我现在没有对它做任何事情。 我添加服务参考时免费获得Async调用...
然而,当我await ma.searchModelsAsync
我被封锁了......
任何人都可以对此有所了解吗?
首先我调用这个函数:
private async void Button_Click_1(object sender, RoutedEventArgs e)
{
button1.IsEnabled = false;
var cnt = await GetDataFromWcf();
button1.IsEnabled = true;
}
这是我调用的实际功能
public async Task<List<ViewModels.ModelInfo>> GetDataFromWcf()
{
using (var ma = new DataGenic.ModelActionsServiceTypeClient())
{
var modelInfos = await ma.searchModelsAsync(new ModelSearchCriteria { Category = "ECB" }, 1, 50);
return modelInfos.Select(mi => new ViewModels.ModelInfo { Id = mi.Id, Name = mi.Name, Uri = mi.Uri }).ToList();
}
}
顺便说一下:如果我把这个函数放在Task.Run(() => ...
中,那么它就像我说明的那样......
不确定WCF是否真的给了我想要的东西......任何想法?
答案 0 :(得分:3)
基于到目前为止的评论主题,听起来在WCF任务启动之前有足够的工作发生,这样你就可以让GetDataFromWcf更快地返回到调用者。这是异步方法(恕我直言)的一个常见问题 - 它们同步运行直到第一次“等待”调用的“问题”,因此如果在第一次'await'之前发生太多,它们仍会导致明显的UI延迟:)
因此,一个简单的改变就是使用Task.Yield(通过添加await Task.Yield();
作为GetDataFromWcf中的第一行)来改变行为,使异步方法立即返回给调用者。正如MSDN文档提到的那样,you can use await Task.Yield(); in an asynchronous method to force the method to complete asynchronously。单独这句话(表面上听起来多么愚蠢)有助于展示'陷阱'恕我直言:)