7

私は「グーグル」しましたが、それでもタスク、スレッド、バックグラウンドワーカーと混同しています.....

  1. 「タスクは現在のスレッドで実行される高レベルのAPIです」は正しいですか?

  2. 1が正しければ、同じスレッドでタスク内のUIを変更するためにinvokeを使用する必要があるのはなぜですか?

  3. バックグラウンドワーカーは、アプリケーションで最も低い優先度しか得られませんでしたか?では、backgroundworkerのパフォーマンスはタスクやスレッドよりも低いのでしょうか?右 ?

  4. 最後に、私のアプリケーションでは、「HttpWebRequest」を使用してサーバーから文字列を取得する必要があります。その後、文字列を解析してUIを更新します。「HttpWebRequest.BeginGetResponse」を使用して非同期結果を待機し、完全なイベントをトリガーしてUIを更新する場合、invokeメソッドを使用してUIスレッドコントロールを呼び出す必要がありますが、代わりにバックグラウンドワーカーを使用できますか?「RunWorkerCompleted」イベントでUIを変更するだけですが、不利な点はありますか?

私のプールの英語と助けてくれてありがとう...!

4

1 に答える 1

5

1) いいえ、タスクはデフォルトでスレッド プール スレッドで実行されます。ただし、タスクを別の方法で実行できる別のスケジューラを提供できます。

3) デフォルトでは優先度に違いはありません。BackgroundWorkerスレッド プール スレッドでも実行されます。

4) を使用するTaskFactory.FromAsyncと、非同期 Web リクエストを処理するかなり簡単な方法になります。

Task.Factory.FromAsync<WebResponse>(request.BeginGetResponse, request.EndGetResponse, null)
    .ContinueWith(
        t =>
        {
            using (var response = (HttpWebResponse)t.Result)
            {
                // Do your work
            }
        },
        TaskScheduler.FromCurrentSynchronizationContext()
    );

を使用すると、コールバックが現在のスレッドで呼び出されるTaskScheduler.FromCurrentSynchronizationContextことが保証されます。ContinueWithそのため、タスクが UI スレッドで作成された場合、応答はバックグラウンドで取得され、UI スレッドで処理されます。

于 2012-09-18T23:50:25.293 に答える