2

想知道是否有人可以告诉我哪里出错了。我在我的 wpf 应用程序 VS2012 中添加了服务引用

但是我对异步调用的等待被阻塞了,我现在没有做任何事情。添加服务参考时我免费获得的异步调用...

然而当我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();
    }
}

顺便说一句:如果我把函数放在 aTask.Run(() => ...那么它的行为就像我预期的那样......

不确定 WCF 是否真的给了我想要的东西.. 任何人的想法?

4

1 回答 1

3

根据迄今为止的评论线程,听起来在 WCF 任务启动之前发生了足够的工作,因此您希望 GetDataFromWcf 比这更早地返回给调用者。这是异步方法(恕我直言)的一个常见问题 - 它们在第一个“等待”调用之前同步运行的“陷阱”,因此如果在第一个“等待”之前发生太多事情,它们仍然会导致明显的 UI 延迟 :)

因此,一个简单的更改是使用 Task.Yield(通过添加await Task.Yield(); 为 GetDataFromWcf 中的第一行)来更改行为以使异步方法立即返回给调用者。正如 MSDN 文档所述,您可以使用 await Task.Yield(); 在异步方法中强制方法异步完成。仅这句话(以及表面上听起来多么愚蠢)有助于显示“陷阱”恕我直言:)

于 2012-09-20T15:34:47.893 回答