我正在尝试以编程方式为我的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: ...
我错过了什么? 什么是可能的解决方案/解决方法?
答案 0 :(得分:2)
您收到的错误是因为您刷新的IResource
也有一个调度规则(IResource
实现ISchedulingRule
)。当存在嵌套的调度规则时,外部规则必须“包含”内部规则 - 您的MutexRule
不会执行此操作。
由于资源已有调度规则,因此无需在工作中设置规则。
refreshLocal
不必在Job
中,但如果从UI线程运行,则应使用IProgressService
或类似内容提供进度监视器。
更新:refreshLocal
可以生成许多资源更改事件,以最大限度地减少使用WorkspaceModifyOperation
或WorkspaceJob
:
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 IFile
和IFolder
API来创建文件和文件夹,在这种情况下,refreshLocal
不是必需的。