2

インターネットからコンテンツをダウンロードするMTアプリがあります(例-たくさんの画像-10Kから5MB)。1回のダウンロードセッションでギガバイトのデータを表すことができます。ダウンロードをParallel.ForEachループでラップしましたが、これは機能しますが、ダウンロードにデバイス上で1つ以上のスレッドを使用していないようです(ダウンロード時間を短縮するために少なくとも2つ必要です)。

注:Parallel.ForEach、シミュレーターで複数のスレッドを作成します。すべてのダウンロードをタスクとしてスレッドプールにスローする必要がありますか?自分のキューとスレッドを起動してスレッドプールをバイパスする必要がありますか?私はスレッドプールがデバイスに一致するようにスケーリングすることを知っているので、それは最良のオプションではないかもしれません。

4

2 に答える 2

1

HTTP経由でダウンロードしていますか?WebClientクラスは、あなたが説明しているタイプのものに対してうまく機能することがわかりました。

何かのようなもの:

WebClient client = new WebClient();
client.DownloadFileCompleted += new AsyncCompletedEventHandler(client_DownloadFileCompleted);
client.DownloadFileAsync("http://stackoverflow.com", "test.txt");
void client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
{
    //file finished downloading
}

このように、スレッドを自分で管理する必要はありません。

また、ファイルからデータをすぐに読み取りたい場合は、単に使用することをお勧めします

DownloadDataAsync

そして、自分でファイルを保存します。

于 2013-01-17T16:45:28.283 に答える
1

IOに関しては、アプリケーション開発者だけが自分がどれだけの並列処理を望んでいるかを知っています。そのためにTPLに依存しないでください-それはIOについて何も知りません。

正しい数のタスクを手動で開始するか、正確な程度の並列処理を備えたPLINQを使用するか、非同期IO(スレッドレス)を使用して、適切な量のIO並列処理を自分で作成します。

于 2013-01-17T19:01:28.167 に答える