【问题标题】:Invoke COM Interop with timeout使用超时调用 COM 互操作
【发布时间】:2011-03-16 23:49:09
【问题描述】:

我想知道如何做到这一点。我有一个 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");
            }

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

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

谢谢!

【问题讨论】:

  • 它是进程内 COM 对象,还是远程 DCOM 对象(名称 dcomSrv 是一个令人不安的线索)?
  • 它是一个 DCOM 对象(一种代理),可以在本地或远程机器上执行

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


【解决方案1】:

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

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

【讨论】:

  • 感谢您的回答,我以这种方式进行了测试,似乎表现合理。
猜你喜欢
  • 2011-11-02
  • 2017-04-28
  • 1970-01-01
  • 2012-07-10
  • 1970-01-01
  • 1970-01-01
  • 2012-02-23
  • 1970-01-01
  • 2022-01-22
相关资源
最近更新 更多