c# - Silverlight和等待失败

标签 c# multithreading silverlight task-parallel-library

我需要通过IoC解析一个属性,如果该属性不存在,则必须对数据库进行处理。
我所有的资料库都采用以下形式

  Task<FilterResponse> GetFiltersForInquiries(int idIstituto);

但是当调用Wait/Result时,我冻结了UI,并且未进行对Web服务的调用

我的通话代码是
   var container = new Container();

        container.RegisterSingle<IBodInquiryRepository>(new BodInquiryRepository());


        container.RegisterSingle<FilterResponse>(() =>
            {
                var repository = container.GetInstance<IBodInquiryRepository>();
                var res = repository.GetFiltersForInquiries(84).Result;

                return res;
            });

由于我无法进行异步/等待,我该怎么办?
如果我在WPF下,我会进行一次同步通话(需要6到7秒的时间)

最佳答案

Result上的Wait()属性和Task方法被阻止。当从UI线程调用时,这是导致死锁的众所周知的原因,因为一旦任务完成,就会尝试在被阻塞的UI线程上执行继续操作,因此无法执行继续操作。

为避免此问题,请尝试将代码更改为:

var res = await repository.GetFiltersForInquiries(84);

Stephen Cleary撰写的article解释了如何使用async/await避免常见的陷阱。

另外,您可以在进行容器注册之前尝试调用async代码。
var repository = container.GetInstance<IBodInquiryRepository>();
var res = await repository.GetFiltersForInquiries(84);
var container = new Container();

container.RegisterSingle<IBodInquiryRepository>(new BodInquiryRepository());


container.RegisterSingle<FilterResponse>(res);

关于c# - Silverlight和等待失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24162370/

相关文章:

c# - 使用私有(private)变量锁定c#

c# - 在派生的 C# 类中隐藏属性

c# - 递归在这个 C# 程序中是如何工作的?

silverlight - Silverlight 3 和/或 4 在什么浏览器下运行?

c# - 在 Windows Phone 运行时更改图像控件的 z 顺序

c# - 在 DropDownListFor 上添加搜索功能

java - 摆脱潜在的僵局

java - 视觉虚拟机表现出奇怪的行为

java - 如何防止数据库关闭后线程继续运行?

c# - Silverlight Deepzoom API 输出与 Deepzoom Composer 输出