长时间运行时泵送Windows消息?

soo*_*ise 22 c# message-pump

我正在运行的大型操作上收到以下消息:

CLR无法从COM上下文0x1fe458过渡到COM上下文0x1fe5c8 60秒.拥有目标上下文/公寓的线程很可能是在非抽空等待或处理非常长时间运行的操作而不抽取Windows消息.这种情况通常会对性能产生负面影响,甚至可能导致应用程序变得无响应或内存使用量随时间不断累积.为了避免这个问题,所有单线程单元(STA)线程都应该使用抽取等待原语(例如CoWaitForMultipleHandles)并在长时间运行操作期间定期泵送消息.

如何发送Windows消息,以便在长时间操作中不再出现此错误?

Jon*_*eet 19

目前还不清楚上下文究竟是什么 - 你是否在WinForms或WPF应用程序的UI线程上执行了一些长时间运行的任务?如果是这样,请不要这样做 - 使用BackgroundWorker,或直接在线程池或新线程上运行任务(可能使用Control.Invoke/BeginInvoke或者Dispatcher如果需要更新UI).如果您的大型操作使用抱怨的COM组件,那将更难......


小智 6

据我所知,这件事只发生在附加的调试器上.你永远不会在生产中得到这个例外.

  • 实际上它并不是因为消息是由VS调试器的管理单元生成的.尽管如此,这一事实并没有消除消息警告的潜在问题. (3认同)