2015-06-02 67 views
0

在這裏我有一個執行的代碼塊:的ManualResetEvent通過螺紋跳過

public override void Execute(XObjectList itemList, ProcessInfo processInfo) { 
     ManualResetEvent syncEvent = new ManualResetEvent(false); 
     execute(itemList, processInfo); 
     //openScreen(); 
     Thread STAThread = new Thread(() => { 
      var window = new Window(); 
      window.Content = new MailViewerView(); 
      window.Show(); 
      syncEvent.Set(); 
     }); 
     STAThread.SetApartmentState(ApartmentState.STA); 
     STAThread.Start(); 
     syncEvent.WaitOne(); 
    } 

我希望到最後一行後,窗口打開,過程本身停下來,而是調用線程的執行只是反覆迭代。任何指針,我做錯了什麼?

**更新 如果我在syncEvent.WaitOne()中設置了一個時間,後臺進程的調試屏幕以及UI將顯示,但UI無法訪問。任何幫助?

**附加信息 我想這樣做,因爲調用execute方法本身的線程是我無法訪問的,我想停止該線程並顯示一個迭代的UI。所以它可能看起來像編碼不好,但這是我想到解決它的唯一方法。

**更新 當執行以下操作:

 public override void Execute(XObjectList itemList, ProcessInfo processInfo) { 
     ManualResetEvent syncEvent = new ManualResetEvent(false); 
     execute(itemList, processInfo); 

     //openScreen(); 
     Thread STAThread = new Thread(() => { 
      var window = new Window(); 
      window.Content = new MailViewerView(); 
      window.Show(); 
      syncEvent.WaitOne(); 
      syncEvent.Set(); 
     }); 
     STAThread.SetApartmentState(ApartmentState.STA); 
     STAThread.Start(); 
    } 

屏幕也顯示與執行線程處於等待狀態,但沒有在屏幕上訪問。任何想法來克服這一部分?

+0

這只是糟糕的代碼,該窗口將永遠不可見。您必須運行調度程序循環,需要Application.Run()。如果這段代碼「一遍又一遍地迭代」,那麼你將擁有一大堆窗口,最好想一想你真正想完成的事情。 –

+0

代碼應該一遍又一遍地運行(它在一個調度程序上),我只想破解本地行爲並在一次迭代後顯示UI。 – svbyogibear

+0

你真的不能在另一個線程上創建一個窗口。它*必須*由主線程創建並擁有,以便消息泵正常工作。這就是爲什麼你的窗口沒有處理任何事件,你停滯了消息泵。 – vcsjones

回答

0

那麼,到底有沒有錯最初的代碼示例,它會)做完全按預期如果我真的叫ShowDialog的(如在這裏看到:

 public override void Execute(XObjectList itemList, ProcessInfo processInfo) { 
     execute(itemList, processInfo); 

     ManualResetEvent syncEvent = new ManualResetEvent(false); 
     //openScreen(); 
     Thread STAThread = new Thread(() => { 
      var window = new Window(); 
      window.Content = new MailViewerView(); 
      window.ShowDialog(); 
      syncEvent.Set(); 
     }); 
     STAThread.SetApartmentState(ApartmentState.STA); 
     STAThread.Start(); 

     syncEvent.WaitOne(); 
    }