终端服务器上运行着一个 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);
}
}