1

メールをダウンロードし、添付ファイルを処理し、UI を更新するために使用されるターミナル サーバーで実行されている Win アプリ ツール (C#) があります。メール添付ファイルのダウンロードと処理は、バックグラウンド ワーカー プロセスを使用して行われます。バックグラウンド ワーカー プロセスは、メールと添付ファイルの合計とそのインスタンスでの処理数を使用して UI を更新する役割も果たします。指定された期間の後に同じバックグラウンド ワーカー プロセスを再初期化し、新しいメールを探すタイマーがあります。

RDC にログインするまではすべて正常に動作しますが、システムをロックする (ウィンドウ キー + L) か、ユーザーを切り替えて同じセッションに戻ると、ツールが動かなくなったり応答しなくなったりします。ロックしてロックを解除しても発生します。瞬時にシステム。別のプロセス監視ツールを使用しました。最初は、子スレッドが定期的に作成および終了されることを示していましたが、スタックした後はアクティビティが表示されません。

なぜそれが起こっているのか、私には手がかりがありません.

以下は、私が使用しているコードのチャンクです。

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