IResource上的refreshLocal抛出异常

时间:2014-07-30 23:17:07

标签: eclipse concurrency eclipse-plugin synchronization eclipse-rcp

我正在尝试以编程方式为我的Eclipse插件刷新项目内的文件夹。我还在Job中包含了一个简单的信号量规则。这是代码:

public class MutexRule implements ISchedulingRule {
    public boolean isConflicting(ISchedulingRule rule) {
        return rule == this;
    }
    public boolean contains(ISchedulingRule rule) {
        return rule == this;
    }
}
...

Job refreshJob = new Job("Refreshing...") {

    public void run() {
        IResource myFolder = ...
        if(myFolder != null)
            myFolder.refreshLocal(DEPTH_INFINITE, null);
    }
};
refreshJob.setRule(

当我安排两个作业并运行刷新时,我得到以下异常:

Attempted to beginRule: P/test, does not match outer scope rule: ...

我错过了什么? 什么是可能的解决方案/解决方法?

1 个答案:

答案 0 :(得分:2)

您收到的错误是因为您刷新的IResource也有一个调度规则(IResource实现ISchedulingRule)。当存在嵌套的调度规则时,外部规则必须“包含”内部规则 - 您的MutexRule不会执行此操作。

由于资源已有调度规则,因此无需在工作中设置规则。

refreshLocal不必在Job中,但如果从UI线程运行,则应使用IProgressService或类似内容提供进度监视器。

更新:refreshLocal可以生成许多资源更改事件,以最大限度地减少使用WorkspaceModifyOperationWorkspaceJob

Job job = new WorkspaceJob("Refreshing") {

   public IStatus runInWorkspace(IProgressMonitor monitor) {
      monitor.beginTask("", IProgressMonitor.UNKNOWN);          

      try {
        resource.refreshLocal(monitor);
      }
      finally {
        monitor.done();
      }

      return Status.OK_STATUS;
   }
});

WorkspaceModifyOperation op = new WorkspaceModifyOperation() {

    @Override
    protected void execute(IProgressMonitor monitor) throws CoreException {

      resource.refreshLocal(monitor);

    }
};

如果您在向导页面中,则可以使用

运行WorkspaceModifyOperation
getContainer().run(true, true, op);

其他地方你可以使用:

IProgressService service = PlatformUI.getWorkbench().getProgressService();

service.run(true, true, op);

更好的方法是使用Eclipse IFileIFolder API来创建文件和文件夹,在这种情况下,refreshLocal不是必需的。