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();
}
屏幕也顯示與執行線程處於等待狀態,但沒有在屏幕上訪問。任何想法來克服這一部分?
這只是糟糕的代碼,該窗口將永遠不可見。您必須運行調度程序循環,需要Application.Run()。如果這段代碼「一遍又一遍地迭代」,那麼你將擁有一大堆窗口,最好想一想你真正想完成的事情。 –
代碼應該一遍又一遍地運行(它在一個調度程序上),我只想破解本地行爲並在一次迭代後顯示UI。 – svbyogibear
你真的不能在另一個線程上創建一個窗口。它*必須*由主線程創建並擁有,以便消息泵正常工作。這就是爲什麼你的窗口沒有處理任何事件,你停滯了消息泵。 – vcsjones