WCF异步操作不是真正的异步

时间:2012-09-19 22:37:01

标签: wpf wcf blocking async-await

想知道是否有人能告诉我哪里出错了。 我在我的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是否真的给了我想要的东西......任何想法?

1 个答案:

答案 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。单独这句话(表面上听起来多么愚蠢)有助于展示'陷阱'恕我直言:)