2015-06-02 65 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(); 
    }