我想知道如何做到这一点。我有一个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");
}
事情是,在任务中没有可以使用取消令牌的循环。
您如何看待,这是一个很好的解决方案还是您有更好的方法?
谢谢!
答案 0 :(得分:2)
Task::Dispose
实际上不会停止Task
的底层线程,因为TPL默认使用ThreadPool来安排它的工作,这个逻辑将消耗一个ThreadPool线程整整20分钟DCOM对象正在阻止它。事实上,如果您在未完成的Dispose
上致电Task
,我很确定您会收到例外情况。
这种情况可能不应该使用TPL而你只是想要启动你自己的Thread
实例,如果它没有在所需的时间内完成,只需Abort
。