我想创建自己的ISearchQuery
,将实际搜索委托给其他几个搜索。我期待只有其中一个搜索实际上会找到一些东西,这就是为什么我想异步运行它们。
然而,我正在努力实现这一目标。 Eclipse中的标准方法可能是使用作业:
@Override
public IStatus run(final IProgressMonitor monitor) throws OperationCanceledException {
for (Delegate delegate : delegates) {
Job job = new Job(delegate.getName()) {
@Override
protected IStatus run(IProgressMonitor monitor) {
delegate.run(monitor);
return Status.OK_STATUS;
}
};
job.schedule();
}
return Status.OK_STATUS;
}
这是异步好的,但问题在于,由于每个作业都有自己的IProgressMonitor
,因此育儿搜索无法获得有关进展如何发生的任何信息(除了作业时“已完成”)已经完成了)。此外,我不确定这些工作是否会同时执行,从我看到他们一个接一个地执行通常。
我找到了SubMonitor,看起来很有希望:
@Override
public IStatus run(final IProgressMonitor monitor) throws OperationCanceledException {
SubMonitor subMonitor = SubMonitor.convert(monitor, delegates.size());
for (Delegate delegate : delegates) {
SubMonitor delegateMonitor = subMonitor.split(1);
delegate.run(delegateMonitor);
}
return Status.OK_STATUS;
}
然而,现在我正在努力解决如何让它以异步方式工作的问题。
我或许可以将这两种方法结合起来,忽略作业的IProgressMonitor
,但感觉就像在作弊。
将IProgressMonitor
拆分为异步任务的最佳方法是什么?
答案 0 :(得分:0)
我自己也没有遇到过这样的情况,所以我的想法并没有得到实际经验的支持。
我的第一选择是安排一个作业并在所有异步任务中共享一个进度监视器。只允许任务报告完成的工作量(即呼叫worked()
)。只会在作业中调用beginTask()
和done()
,就像在第二个代码段中勾画一样。
除了FutureProgressMonitor
之外,我遇到的IProgressMonitor
实现似乎都不是线程安全的。
因此,您需要实现一个线程安全的包装器。或者查看FutureProgressMonitor
是否合适。
此外,Job需要等待所有任务完成。也许从约伯的Job.ASYNC_FINISH
方法返回run()
也可行,但到目前为止我还没有用过它。