【发布时间】:2011-06-22 16:26:06
【问题描述】:
我有一个调用 COM 组件的 c# 静态函数。
当从一个普通的 WPF 应用程序调用这个函数时,它会正确返回。 代码可能如下所示:
var result = MyClass.StaticCall();
Debug.WriteLine("Hurrah!");
当我调用该代码时,将设置变量并按预期输出调试消息。
但是,如果我将同一个调用包装在一个线程中,它就永远不会返回。失败的代码可能如下所示:
var foo = new Thread(new ThreadStart(() =>
{
var result = MyClass.StaticCall();
Debug.WriteLine("Hurrah!");
}));
foo.Start();
while (foo.IsAlive)
{
}
在这种情况下,StaticCall 不会返回,线程被无限期阻塞。
什么可能导致这种行为?
附加信息:
- 设置线程的appartment状态没有区别。
- Visual Studio 输出窗口中的最后一条消息是 COM 互操作已加载的通知。
- 对 COM 的所有调用都在一个线程上隔离。
【问题讨论】:
-
代码after foo.Start() 是什么?这很重要。当你的主线程没有空闲时,死锁很常见。
-
@Hans 我已编辑问题以添加该详细信息。
标签: .net multithreading com-interop