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

Cai*_*der 4 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);
                    }
                }
            }
        });
Run Code Online (Sandbox Code Playgroud)

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

Edw*_*son 5

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

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

  • 对于它的价值,如果你真的想在UI线程上运行它(并且没有理由你应该),那么一定要使用Display#readAndDispatch来填充UI线程,以防止它完全饿死UI. (2认同)

Phi*_*ilJ 5

您可以使用Eclipse Jobs API.

创建一个扩展的类,org.eclipse.core.runtime.jobs.Jobrun方法中粘贴数据库代码,然后调用job.schedule()计划并运行作业.

请看看Lars Vogel的网站,以获得更多示例.