ass*_*sin 75 c# multithreading
我正在运行C#应用程序,在运行期间我收到以下错误:
CLR无法从COM上下文0x20e480过渡到COM上下文0x20e5f0 60秒.拥有目标上下文/公寓的线程很可能是在非抽空等待或处理非常长时间运行的操作而不抽取Windows消息.这种情况通常会对性能产生负面影响,甚至可能导致应用程序变得无响应或内存使用量随时间不断累积.为了避免这个问题,所有单线程单元(STA)线程都应该使用抽取等待原语(例如CoWaitForMultipleHandles)并在长时间运行操作期间定期泵送消息.
有人可以帮我解决这个问题吗?
非常感谢.
Han*_*ant 121
程序的主线程一直忙于执行代码一分钟.它没有照顾它的正常职责,抽取信息循环.在工作线程中使用COM服务器时,这是非法的:在主线程再次空闲之前,无法调度对其方法的调用.
应该很容易看到,你的UI应该像门钉一样死了.Windows应该使用显示"无响应"的重影替换主窗口.关闭窗口将不起作用,没有任何点击事件有效.
无论你的主线程做什么,都应该由工作线程完成.这个BackgroundWorker类很适合你,你会在MSDN Library文章中找到很多用法帮助.如果您不知道主线程正在做什么,请使用Debug + Break All,Debug + Windows + Threads.
还有一个可能原因:如果您使用的是RTM版本的VS2005,请务必安装Service Pack 1.
Sco*_*nro 48
要查找阻止上下文切换的操作并导致显示contextSwitchDeadlock MDA,可以使用以下步骤.请注意,我将引用Visual Studio 2012.
假设您决定不从主线程移动资源密集型操作 - 在此之前先查看其他一些答案和注释 - 您可以使用以下选项来禁用托管调试助手.
在Visual Studio调试器中
...在"调试"菜单上,单击"例外".(如果"调试"菜单不包含"例外"命令,请单击"工具"菜单上的"自定义"以添加它.)在"例外"对话框中,展开"托管调试助手"列表,然后清除单个MDA的"已抛出"复选框.
在Visual Studio调试器之外
注意:前两个选项中的一个必须设置为1才能使第三个选项生效.
在我的例子中,问题是在控制台应用程序中调用Entity Framework中的ObjectContext.SaveChanges().将MTAThreadAttribute应用于该Main()方法后,不再引发ContextSwitchDeadlock异常.遗憾的是,我不确定这一变化的全部影响.
此消息表明您的某些代码正在尝试切换线程,并且目标线程正忙.例如,后台线程尝试将调用分派给UI线程以更新UI,而UI正在运行一段时间的紧密循环.
要真正弄清楚发生了什么,你需要进入调试器并查看所有线程以及它们正在做什么.