2011-03-16 32 views
1

我想知道如何完成此操作。我有一个COM对象,其操作有时需要很长时间,另外我注意到,如果出现错误,它有20分钟的超时时间。这是客户端程序等待这么长时间无法接受的。通过超时调用COM Interop

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

我有COM帮手通过反射,这是同步做invokation:

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

这得到了布尔属性从COM实例

,我想换这个使用任务:

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

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

问题是,在任务中没有循环,我可以使用取消令牌。

您认为这是一个很好的解决方案还是您有更好的?

谢谢!

+0

它是一个进程内COM对象还是一个远程DCOM对象(名称“dcomSrv”是一个令人不安的线索)? – 2011-03-16 10:26:53

+0

这是一个DCOM对象(类型的代理),可以在本地执行或在远程机器上执行 – Robert 2011-03-16 10:31:55

回答

2

Task::Dispose实际上不会停止Task的底层线程,并且因为TPL使用线程池默认情况下安排其工作的,这个逻辑会消耗线程池线程全20分钟的DCOM对象被阻止。事实上,如果您拨打Dispose未完成Task,我敢肯定你会得到一个例外。

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

+0

感谢您的答案,我以这种方式进行测试,似乎表现合理。 – Robert 2011-03-17 10:56:49

相关问题