C#でシリアルポートからデータを取得し、処理してUIに表示するアプリケーションを開発中です。 データは5〜50msの速度で非常に高速になります。私がスレッドを使用していないうちにアプリケーションがシリアルポートからデータを取得していた単一のアプリケーションスレッドに依存していたため、データを処理してUIに表示していました。いくつかのデータが失われていました。 その後、私はBackgroundWorkerスレッドを実装して、シングルスレッドのオーバーヘッドを取り除き、優れたパフォーマンスを考え始めました。そして、今私は "このBackgroundWorkerは現在ビジー状態であり、複数のタスクを同時に実行することはできません"というエラーが発生しました。私はスレッドがシリアルポートから来るデータの速度に対応することができないと思う。 "backgroundWorker1.RunWorkerAsync(data);"を実行するとエラーが発生します。私はこのような種類のシナリオを実装するためのよりよいアプローチが何か提案を必要としていますか?シリアルポートのデータ処理に使用されるスレッド「このBackgroundWorkerは現在ビジー状態であり、複数のタスクを同時に実行できません」
答えて
問題は、以前の操作が終了する前にbackgroundWorker1.RunWorkerAsync()を呼び出していることです。
おそらく、シリアルポートを読み取ってデータをバッファリングし、メインUIスレッドにデータが利用可能であることを通知する単一のスレッドが必要です。
ありがとうございました。 シリアルポートからのデータの読み取り、データのバッファリング、UIへの通知に、単一バックグラウンドワーカースレッドを使用しています。私はbackgroundWorker1_RunWorkerCompletedイベントは有効な出力があることを通知すると思うif(e.Result!= null){}私は間違っている場合、UIスレッドを修正します。 - Chetan –
Mirozellの答えを確認してください:) – geofftnz
これを追加して、バックグラウンドワーカーが一度に1つのジョブしか実行していないことを確認してください。
if(!backgroundWorker1.IsBusy)
backgroundWorker1.RunWorkerAysnc();
あなたはまた、現在のジョブをキャンセルする能力を持って、ここ
private void WhereBackworkerStarts()
{
backgroundWorker.WorkerSupportsCancellation = true;
if (backgroundWorker.IsBusy)
backgroundWorker.CancelAsync();
else
backgroundWorker.RunWorkerAsync();
}
// Events
static void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
for(int i = 0; i < int.MaxValue; i++)
{
if (backgroundWorker.CancellationPending)
{
e.Cancel = true;
return;
}
// Do work here
}
e.Result = MyResult;
}
static void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
// Deal with results
}
私はすでにこれを追加しましたが、このスレッドではデータが処理されず、UIには向いていないときにデータが失われています。 –
私はアプローチデータが絶えず流れるようにしています。 –
あなたの最善の策は、これらの*一般的な*バックグラウンドの裏にあるデータを処理するために使用され、UIが依然として応答している間、定期的にUIを更新するので、単一のbackgroundWorkerの代わりにスレッドプールを使用することです。 – PostMan
geofftnzが正しいコードサンプルであり、私はあなたのためにビットを拡張します。バックグラウンドワーカーは一度起動し、ReportProgressを使用してGUIスレッドにデータを戻すようにしてください。ワーカースレッドは次のようになります。
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackGroundWorker;
while(!e.CancellationPending)
{
ResultObject ro = new ResultObject(); // your own type here, obviously
//Process and store some data in ro;
worker.ReportProgress(0, ro);
//Do not modify ro after reporting progress to avoid threading issues
}
}
GUIからは、ProgressChangedイベントに登録し、ワーカーを1回だけ起動します。
ありがとうMirozell、 roの値を確認してUIに自分のデータを送るメソッドを呼び出しています。しかし、それはどういうわけかこの関数を適切に処理していません。私がその機能をデバッグしているとき、それを正しくデバッグして前後にジャンプすることはできません。ここで何が起こっているのか分かりません。 –
Visual Studioはブレークポイントにヒットしたスレッドに自動的にジャンプします。 'Show threads in source'をオンにすると、他のスレッドがどこにあるのかを示す小さな指標が得られます。あなたのケースで最も簡単なのはおそらく、GUIスレッドのデバッグ中にワーカーのブレークポイントを削除/無効にすることです。逆もまた同様です。 – Mirozell
私はこれを解決することができます。私がやっているのは、シリアルポートから得たデータです。これをキューに追加しています。 Busy状態をチェックしてBackgroundWorkerスレッドを使用してQueueをDequeingしています。とにかく例外はありません。あなたのおかげで、私をサポートするのに時間を費やしてくれました。 –
- 1. このBackgroundWorkerは現在ビジー状態で、複数のタスクを同時に実行することはできません
- 2. スレッドはWaitSleepJoin状態にあり、実行中ではありません
- 3. 現在のスレッドで使用可能な実際のトランザクションを持つEntityManagerはありません。 'remove'コールを確実に処理できません。例外
- 4. 現在のスレッドでScalaZタスクを実行するには
- 5. バッファリングされたデータに複数のスレッドをねじれた状態で実行するには?
- 6. サーバーは現在この要求を処理できません
- 7. phpMailer - localhostは現在このリクエストを処理できません。
- 8. SimpleXMLElementトリガーは「現在このリクエストを処理できません」
- 9. 127.0.0.1は現在このリクエストを処理できません
- 10. 現在のスレッド上のRunLaterまたは後で実行する現在のスレッドにタスクを与える
- 11. Mqttクライアントは同時に複数のメッセージを処理できません
- 12. ui-routerを使用して2つの状態に同じコントローラを使用するとデータが瞬時に変更されることはありません
- 13. JavaScriptで実行時にメモリ不足の状態を処理する方法はありますか?
- 14. 実行が非同期セクションにあるときにスレッドがブロックされた状態になる理由
- 15. 長時間実行されている操作でビジー状態のときにWCFサービスへのPINGの応答
- 16. 前のページに戻る前のページ状態現在のページJavaScriptの状態はありません
- 17. メッセージフィルターは、アプリケーションがビジー状態であることを示していますが、同時に複数のWebブラウザーコントロールを使用しています
- 18. 複数のタスクを同時にcrontabで実行する
- 19. TransactionManagerException:このスレッドのトランザクションは現在ありません
- 20. VB.netでビジー状態のときのイベント処理を抑制する
- 21. エラーメッセージを処理する方法:このコンテキストではセッション状態は使用できません
- 22. 実行時エラー3021. '現在のレコードがありません'!
- 23. ポート3306がビジー状態ですが、それを使用しているプロセスはありません
- 24. なぜ複数のスレッドを同時に実行できる同期メソッド?
- 25. Wordpress:私のサイトに「現在このリクエストを処理できません」というエラーがあります
- 26. 多数のタスクを同時に非同期に処理する
- 27. java.sql.SQLException:無効なカーソル状態 - 現在の行がありません
- 28. 同じエアアプリケーションの複数のインスタンスを同時に実行させることはできますか?
- 29. スレッドが起動しない他のスレッドがビジー状態です
- 30. purrr(同時にではありません)で2つのリストを繰り返し処理できますか?
この回答は適用されますか? http://stackoverflow.com/questions/588150/c-this-backgroundworker-is-currently-busy-and-cannot-run-multiple-tasks-concurre/588158 –
100%ではありませんが、これらのすべてから道がありますコメントをサポートし、私は問題を解決することができます。お返事ありがとう –