システムにチェックを入れました
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();
}
ありがとう