1

システムにチェックを入れました

 public void ProcesssMessages(ResponseEventArgs message)
        {
            _queue.Enqueue(message);

            if (!backgroundWorker1.IsBusy)
            {
                backgroundWorker1.RunWorkerAsync();
            }
        }

それでも、 backgroundworker1 is already running というエラーが表示され、2回実行することはできません。これは、バックグラウンド ワーカーを実行する画面内の唯一のポイントであるため、その間に誰かが他のセクションから実行する方法はありません。

安全または失敗しないようにする方法はありますか。

私は完了したイベントを処理していないため、そのイベントをブロックする方法はありません。これはユーザーコントロールにあり、誰かがこのユーザーコントロールのメソッドにアクセスし、そのメッセージをキューに追加するため、完了イベントで実行できません。次に、バックグラウンド ワーカーを使用してそのメッセージを処理する必要がありますが、最初に、バックグラウンド ワーカーが既にキューを処理しているかどうかを確認する必要があります。バックグラウンドワーカーのコードは

 void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        while (_queue.Count > 0)
        {
            ResponseEventArgs currentMessage = _queue.Dequeue();
            if (currentMessage != null)
            {
                AddUpdateDataRow(currentMessage);
                UpdateMainUI();
            }
        }
    }

UpdateMainUI メソッドのコード

   private void UpdateMainUI()
        {
            if (gridControl1.InvokeRequired)
            {
                gridControl1.Invoke(new MethodInvoker(UpdateMainUI));
            }

            gridControl1.RefreshDataSource();
        }

ありがとう

4

0 に答える 0