C# 代码中的ContextSwitchException问题

C# 代码中的ContextSwitchException问题,c#,multithreading,C#,Multithreading,我有一个WindowsSVC,它可以进行几个wmi调用。这会导致相当长的代码运行时间(这项任务大约需要两分钟),并且还会冻结UI线程(我打算对progressbar使用backgroundworker,对实际操作使用另一个线程) 目前,在所有这些之前,我得到了一个contextswitchexception。代码本身可以工作,因为它可以成功执行,并且如果我将其粘贴到应用程序本身中,它会执行所需的操作 目前,我已经关闭了此异常的MDA,并在长时间运行的任务之前调用Application.DoEve

我有一个WindowsSVC,它可以进行几个wmi调用。这会导致相当长的代码运行时间(这项任务大约需要两分钟),并且还会冻结UI线程(我打算对progressbar使用backgroundworker,对实际操作使用另一个线程)

目前,在所有这些之前,我得到了一个contextswitchexception。代码本身可以工作,因为它可以成功执行,并且如果我将其粘贴到应用程序本身中,它会执行所需的操作

目前,我已经关闭了此异常的MDA,并在长时间运行的任务之前调用Application.DoEvents()。要消除此异常还需要什么


谢谢

您一定是在谈论被称为contextSwitchDeadlock的托管调试助手。这是代码冻结UI线程的直接后果。该警告与COM关联,它使用UI线程的消息循环封送对非线程安全的COM对象的调用。如果UI线程没有泵送消息循环,那么这些调用将无法完成。WMI使用COM

这通常是一个非常现实的问题,在这种情况下死锁非常常见。例如,可以在完成作业的工作线程上设置UI线程块。BackgroundWorker.IsBusy上的循环就是一个典型的例子。如果该工作线程正在对单元线程COM对象进行COM调用,则会导致死锁。工作线程无法完成,因为UI线程正在阻塞且未分派COM调用。UI线程无法完成,因为工作线程没有进展。僵局


听起来你的情况并不是真正的僵局。警告的超时时间是一分钟,iirc。如果你不介意冻结的用户界面,那么你就不会有真正的问题。UI线程继续正常工作后,所有内容都会再次开始移动。你不会因为优雅而得到任何分数。

所以在我的例子中,如果我只是做了修改,并关闭MDA,代码应该可以很好地执行,对吗?顺便说一句,windows服务是从winforms应用程序调用的,因此它们也是独立的进程。