1

终端服务器上运行着一个 Win app 工具(C#),用于下载邮件、处理其中的附件并更新其 UI。邮件附件的下载和处理是使用后台工作进程完成的,该进程还负责使用该实例的邮件和附件总数和处理计数更新 UI。有一个计时器可以在指定的持续时间后重新初始化相同的后台工作进程并寻找新邮件。

在我登录 RDC 之前一切正常,但是当我锁定系统(窗口键 + L)或切换用户并返回以重新获得相同的会话时,工具卡住/无响应,即使我锁定和解锁也会发生系统瞬间。我使用了另一个进程监控工具,它最初显示子线程被创建并定期退出,但在它卡住后没有显示任何活动。

我不知道为什么会发生这种情况,窗口混乱是否停止或 UI 控件句柄丢失或或或....

以下是我正在使用的代码块:

private void tmrScheduler_Tick(object sender, EventArgs e)
    {
        Application.DoEvents();
        if (bgwMailParser == null || (!bgwMailParser.IsBusy && !objfeMailImportNParse.Is_Parsing))
        {
            bgwMailParser = new BackgroundWorker();
            bgwMailParser.DoWork += new DoWorkEventHandler(objfeMailImportNParse.opLoadCommonData);
            bgwMailParser.DoWork += new DoWorkEventHandler(objfeMailImportNParse.StartMailImport);

            if (HireCraft.Properties.Settings.Default.Close_App_After_Parsing)
                bgwMailParser.RunWorkerCompleted += new RunWorkerCompletedEventHandler(opCloseApplication);

            bgwMailParser.RunWorkerCompleted += new RunWorkerCompletedEventHandler(opDisposeWorker);

            bgwMailParser.RunWorkerAsync();
        }
        Application.DoEvents();
    }

下面的方法处理 bgWorker 进程引发的事件

private delegate void Del_updateParsedCounter(Int64 del_MailCount, Int64 del_AttchCount);
    private void UpdateParsedCounter(Int64 MailCount, Int64 AttchCount)
    {
        try
        {
            if (lblMailParsedCount.InvokeRequired)
            {
                Del_updateParsedCounter objUpdateParsedCounter = new Del_updateParsedCounter(UpdateParsedCounter);
                this.Invoke(objUpdateParsedCounter, new object[] { MailCount, AttchCount });
            }
            else
            {
                lblMailParsedCount.Text = MailCount.ToString();
                lblAttchSavedCount.Text = AttchCount.ToString();
            }
        }
        catch (Exception ex)
        {
            Debug.Assert(false, ex.Message, ex.StackTrace);
        }
    }
4

1 回答 1

1

我确定了问题的解决方案,但忘记了我在这里提出了一个没有得到回答的问题。

问题是后台工作线程在代码的深处声明了一个 UIControl。

当线程创建 UIControl 时,它还会向 SystemEvents.UserPreferenceChanged 事件注册自己,该事件通知颜色、主题、屏幕大小更改、系统锁定/解锁等,并响应哪个父线程需要缺少后台工作线程的消息泵,事件invoke 等待(永远不会出现)响应,导致应用程序挂起或无响应。

http://support.microsoft.com/kb/943139指向 Microsoft 支持的链接解释了相同的内容。

于 2013-06-19T18:03:57.537 回答