ManualResetEvent 被线程跳过
ManualResetEvent Skipped by thread
这里我有一段代码执行:
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();
}
我希望在最后一行之后,window 打开并且进程本身停止,但是调用执行的线程只是一次又一次地迭代。关于我做错了什么的任何指示?
**更新
如果我在 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();
}
屏幕确实显示并且执行线程正在等待,但屏幕上的任何内容都不可访问。关于克服这部分的任何想法?
所以最终初始代码示例没有任何问题,如果我实际调用 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();
}
这里我有一段代码执行:
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();
}
我希望在最后一行之后,window 打开并且进程本身停止,但是调用执行的线程只是一次又一次地迭代。关于我做错了什么的任何指示?
**更新 如果我在 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();
}
屏幕确实显示并且执行线程正在等待,但屏幕上的任何内容都不可访问。关于克服这部分的任何想法?
所以最终初始代码示例没有任何问题,如果我实际调用 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();
}