開発中のアプリケーションで .NET Backgroundworker オブジェクトを使用しようとしています。
インターネット上のすべての資料は、このオブジェクトが「バックグラウンド」で実行されると述べていますが、このバックグラウンド スレッドが実際に「低優先度」モードで実行されていることを確認できた場所はありません。この疑問が生じるのは、Windows (私が推測する) では、バックグラウンド タスクが「通常」または「通常以下」または「低」の優先度モードで実行される可能性があるためです。
私のアプリケーションでは、DoWork 関数内で自分で優先順位を設定しようとしました...
Thread.CurrentThread.Priority=ThreadPriority.Lowest
...
しかし、これは効果がないようです。バックグラウンドワーカーはこの呼び出しを無視しますか?
もう少し説明したいと思います:
私のアプリケーションは、チャンバーから温度、湿度などのリアルタイム データを収集し、使用して Web ページ (Web サービスではない) にアップロードするインターネット クライアントです。
system.net.webclient.UploadValuesAsync(...)
通話
クライアント GUI がチャンバーからデータを収集し、タイムスタンプを付けて、アップロードのためにキューに入れるように、アプリケーションを作成しました。
...
Synclock objlock
debug.print("Queueing reading...")
dataQ.Enque(reading)
End Synclock
...
バックグラウンドワーカーの Dowork 関数は、デキューしてからアップロードします...
…………
Do
if dataQ.count() <> 0 then
Synclock objlock
reading = dataQ.DeQue()
End Synclock
Dim client As New System.Net.WebClient
...put the reading in NameValueCollection and upload to server page
req = new NameValueCollection
...
...
client.UploadValuesAsync(uri, "POST", req)
endif
thread.sleep(1) 'without this line the CPU usage goes upto 100% and seems to slow other tasks!
Loop
...............
プログラムを実行すると、UploadValuesAsync が呼び出されて出力されるたびに、デバッグ ウィンドウが停止することがわかりました。また、デバッグ ステートメントを追加して、キューにある読み取り値の数をいつでも確認できるようにしました。このタスクが本当に低い優先度で実行されている場合、データが取得されるとキューの数が急速に増加し、フォアグラウンドがアイドル状態でデータが取得されていないときにのみ減少することが予想されました。しかし、そうではありません。読み取り値がキューに追加されるとすぐに、キューから取り出されてアップロードされます。したがって、キュー カウントは常に 1 または 0 です。
私のアプローチに何か問題がありますか?background-worker オブジェクトをまったく使用しないでください。
ところで、これは Windows XP を実行しているデュアルコア ラップトップです。