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