2012-02-28 46 views

回答

1

对任何线程(包括UI线程)执行Display.syncExec/asyncExec都是安全的,但它并不总是最好的路线。例如,即使您已经在UI线程上,asyncExec也会将您的runnable添加到队列中以便稍后执行。取决于你的用例,这可能或不可取。通常,如果您知道您已经在UI线程中,最好继续并执行该工作项目。

我喜欢在任何需要更新UI的方法中使用以下代码片段,并且可能会从非UI线程调用。如果从UI线程调用,它立即执行工作。如果从其他线程调用,它使用asyncExec安排下一批次的工作而不阻塞调用线程。

public void task() 
{ 
    if(this.display.getThread() != Thread.currentThread()) 
    { 
     this.display.asyncExec 
     (
      new Runnable() 
      { 
       public void run() 
       { 
        task(); 
       } 
      } 
     ); 

     return; 
    } 

    // Do whatever needs to be done with the UI. 
} 
+0

我目前的用例是向用户报告错误。你认为在这种情况下最好的是什么? – vitaut 2012-02-29 16:19:43

+0

我想说,如果您已经在UI线程上,您会希望立即发生错误。如果你还没有在UI线程上,asyncExec应该没问题。 – 2012-02-29 17:44:57

1

执行Display.syncExec/asyncExec从任何线程调用时都应该是安全的,不管是否是UI。

有人可能会怀疑从UI线程调用syncExec会导致死锁。由于syncExec方法首先检查调用线程是否为UI线程,因此情况并非如此。如果是这样,则立即执行Runnablerun方法。