处理一个非常长的查询以避免托管调试助手' ContextSwitchDeadlock'?

时间:2017-08-22 08:41:12

标签: c# multithreading linq asynchronous async-await

在WPF应用程序中,我有一个查询应该得到一个非常繁重的数据(在ObjectJson记录下面的LINQ查询大小为10MB!),

这是方法:

public  List<HistoryLog> GetAudits(List<Guid> userIds, DateTime? fromDate, DateTime? toDate, List<string> formNames)
{

     var audits = from h in oContext.TbHistoryLog
                  join o in oContext.TbObjects on h.FormName equals o.ObjectRealName
                  join u in oContext.TbUsers on h.UserId equals u.UserId
                  where userIds.Contains((Guid)h.UserId) && formNames.Contains(o.ObjectRealName)
                  && h.DateUpdated > fromDate && h.DateUpdated < toDate
                  orderby h.DateUpdated
                      select new HistoryLog
                      {
                          UserName = Helper.CurrLang == Helper.SystemLanguage.Arabic ? u.UserAName : u.UserEName,
                          UserCode = u.UserCode,
                          DateUpdated = h.DateUpdated,
                          ObjectCode = h.ObjectCode,
                          JSONClassName = h.JSONClassName,
                          FormName = h.FormName,
                          State = h.State,
                          ObjectJson = h.ObjectJson,
                      };

      return  audits.ToList(); //exception is thrown on this
}

我得到了这个例外

  

托管调试助手&#39; ContextSwitchDeadlock&#39; :&#39; CLR有   无法从COM上下文0x7d9d408转换到COM上下文   0x7d9d350持续60秒。拥有目标的线程   上下文/公寓最有可能是做一次非抽水等待或   处理非常长时间运行的操作而无需泵送Windows   消息。这种情况通常会对性能产生负面影响   甚至可能导致应用程序变得无响应或内存   使用量随着时间的推移不断累积。所有人都要避免这个问题   单线程公寓(STA)线程应该使用抽水等待   原语(如CoWaitForMultipleHandles)和常规泵   长时间运行的消息。&#39;

应用程序挂起一分钟然后触发异常..对此有何帮助?正在编写async方法来解决这个问题吗?

0 个答案:

没有答案
相关问题