关于C#中线程的奇怪消息

时间:2010-02-08 18:43:24

标签: c# com clr multithreading

我有一个程序,我运行,在中间我得到这个消息:

托管调试助手'ContextSwitchDeadlock'在'C:\ Documents and Settings \ Lena G \ My Documents \ SchoolStuff \ IR Information \ Home Work \ FianlProject \ finalProject \ finalProject \ bin \ Debug \ finalProject.vshost中检测到问题。可执行程序'。 附加信息:CLR无法从COM上下文0x3407968转换到COM上下文0x3407ad8 60秒。拥有目标上下文/公寓的线程很可能是在非抽空等待或处理非常长时间运行的操作而不抽取Windows消息。这种情况通常会对性能产生负面影响,甚至可能导致应用程序变得无响应或内存使用量随时间不断累积。为了避免这个问题,所有单线程单元(STA)线程都应该使用抽取等待原语(例如CoWaitForMultipleHandles)并在长时间运行操作期间定期泵送消息。

据我所知,它与运行60秒而不停止或类似的事实有关?这怎么回事? 我也把[STAThread]放在我程序的主要部分之前,因为如果我删除它,那么它会显示这条消息:

System.Windows.Forms.dll中发生未处理的“System.Threading.ThreadStateException”类型异常 附加信息:在进行OLE调用之前,必须将当前线程设置为单线程单元(STA)模式。确保您的Main函数标记了STAThreadAttribute。仅当调试器附加到进程时才会引发此异常。

任何人都知道如何解决这个问题?

提前致谢,

海伦

2 个答案:

答案 0 :(得分:2)

您需要确保拥有COM组件的线程没有通过处理> 60秒来“锁定”。

可能发生的事情是您在表单中有一个COM对象,并且您正在UI线程上工作。如果您的用户界面因处理> 60秒而被阻止,则COM组件可能会抱怨。

考虑使用BackgroundWorker实例来处理长时间运行的进程。这会将工作推送到后台线程,并允许COM组件处理消息而不会抱怨。

答案 1 :(得分:1)

当您从后台线程调用ActiveX对象并且主线程被阻止时,会生成警告。也许更有可能的是:Visual Studio 2005的零售版本中有一个错误,没有任何理由将这个警告绊倒。它已在Service Pack 1中修复,请确保已安装。另一个解决方法是关闭它。 Debug + Exceptions,Managed Debugging Assistants,取消关闭ContextSwitchDeadlock警告。但如果你没有SP1,请使用SP1。