Silverlight和Wait失败了

时间:2014-06-11 11:57:44

标签: 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秒)

1 个答案:

答案 0 :(得分:3)

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);