0

在这里,我有一个执行的代码块:

    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 不可访问。有什么帮助吗?

**附加信息我想这样做,因为调用执行方法本身的线程是我无法访问的,我想停止该线程并显示它的一次迭代的 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();
    }

屏幕确实显示并且执行线程正在等待,但屏幕上的任何内容都无法访问。有什么想法可以克服这部分吗?

4

1 回答 1

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();
    }
于 2015-06-02T14:54:54.547 回答