使用超时调用COM Interop

时间:2011-03-16 08:30:29

标签: c# .net asynchronous com-interop task-parallel-library

我想知道如何做到这一点。我有一个COM对象,其操作有时需要很长时间,另外我注意到,如果出现问题,它有自己的超时20分钟。客户端程序等待这么长时间是不可接受的。

因此我正在考虑在另一个线程上调用COM操作,并且在某些超时之后才会杀死该线程。

我有COM助手通过反射进行调用,这是同步的:

ComInvoke.Get<bool>(dcomSrv, "Launched");

这从COM实例

获取布尔属性

我希望使用Task包装它:

var task = Task.Factory.StartNew<bool>(() =>
            {
                return ComInvoke.Get<bool>(dcomSrv, "Launched");
            });

if (task.Wait(5000) == false)
            {
                task.Dispose();
                throw new Exception("Task timeout");
            }

事情是,在任务中没有可以使用取消令牌的循环。

您如何看待,这是一个很好的解决方案还是您有更好的方法?

谢谢!

1 个答案:

答案 0 :(得分:2)

Task::Dispose实际上不会停止Task的底层线程,因为TPL默认使用ThreadPool来安排它的工作,这个逻辑将消耗一个ThreadPool线程整整20分钟DCOM对象正在阻止它。事实上,如果您在未完成的Dispose上致电Task,我很确定您会收到例外情况。

这种情况可能不应该使用TPL而你只是想要启动你自己的Thread实例,如果它没有在所需的时间内完成,只需Abort