Display.getCurrent()。asyncExec不能并行运行?

时间:2011-08-09 10:25:39

标签: swt eclipse-rcp

这是我的代码:

Display.getCurrent().asyncExec(new Runnable() {
            public void run() {
                try {
                    Event e1 = new Event();
                    e1.type = EVT_CONNECTING;
                    for (Listener listener : listeners) {
                        listener.handleEvent(e1);
                    }
                    database = new Database(cp.getName(), cp.getConnection());
                    Event e2 = new Event();
                    e2.type = EVT_CONNECT_SUCCESS;
                    for (Listener listener : listeners) {
                        listener.handleEvent(e2);
                    }
                } catch (Exception ex) {
                    log.error(ex.getMessage(), ex);
                    Event e = new Event();
                    e.text = ex.getMessage();
                    e.type = EVT_CONNECT_FAILD;
                    for (Listener listener : listeners) {
                        listener.handleEvent(e);
                    }
                }
            }
        });

在上面的代码中,我尝试连接到数据库。有时这需要很长时间才能给出响应(例如网络连接超时),但是当Runnable开始运行时,用户界面会丢失响应。为什么呢?

3 个答案:

答案 0 :(得分:5)

你正在UI线程上运行这个数据库连接Runnable - 这意味着你正在饿死UI线程处理任何其他可能导致它绘制的消息,响应点击事件等等。所以是的,当你在重新运行此数据库连接作业时,您的UI将无法执行任何其他操作,并且UI将无法响应。

您可能想要在UI线程上运行此数据库连接作业,您可能希望在简单的后台线程中执行此操作,然后将结果发布回UI线程数据库连接作业完成后使用Display#asyncExec

答案 1 :(得分:5)

您可以使用Eclipse Jobs API。

创建一个扩展org.eclipse.core.runtime.jobs.Job的类,将数据库代码放在run方法中,然后调用job.schedule()来安排和运行作业。

请查看Lars Vogel's site以获取更多示例。

答案 2 :(得分:1)

asyncExec的目的是安排在UI线程中运行的东西(并在调度后立即返回),因此不能并行运行任何东西。