1

.NET 4.5 を使用して WPF でアプリケーションを作成しています。このアプリケーションを使用すると、ユーザーは複数のファイルを選択してインポートできます。これが発生すると、アプリケーションはテキスト ファイルを解析し、データをデータベースに保存します。ファイルは非常に大きくなる可能性があるため、UI の応答性を維持し、これが発生している間もユーザーが他のことを実行できるようにしたいと考えています。

私は非同期プログラミングが初めてで、最善のアプローチが何であるかを知りたいですか? マイクロソフトの記事によると...

「async キーワードと await キーワードによって、追加のスレッドが作成されることはありません。非同期メソッドは独自のスレッドで実行されないため、非同期メソッドはマルチスレッドを必要としません。メソッドは現在の同期コンテキストで実行され、スレッドで時間を使用します。メソッドがアクティブな場合のみ。Task.Run を使用して、CPU バウンドの作業をバックグラウンド スレッドに移動できますが、バックグラウンド スレッドは、結果が利用可能になるのを待っているだけのプロセスには役立ちません。」

複数のファイルを処理しているので、ファイルごとに「Task.Run」を使用したほうがよいでしょうか。ファイルは別々のスレッドで実行されるからですか? そうでない場合、async/await を使用して同じスレッドですべてを実行する利点は何ですか?

他の UI 操作 (プログレス バー - プログレス レポートを除く) は、これらのファイルの処理がいつ完了したかを実際に気にしないことに注意してください。あなたの考えは何ですか?

4

1 に答える 1

3

ファイルで何をしていますか?CPU を集中的に使用する場合は、その処理を UI スレッドから移動することをお勧めします。それが本当に IO になるだけの場合は、UI スレッドですべてを行うことができますが、それでも並行処理を行うことができます。

例えば:

private async Task ProcessAllFiles(IEnumerable<string> files)
{
    List<Task> tasks = files.Select(x => ProcessFile(x))
                            .ToList();
    await Task.WhenAll(tasks);
    textBox.Text = "Finished!";
}

private async Task ProcessFile(string file)
{
    // Do stuff here with async IO, and update the UI if you want to...
}

ここでも、UI スレッドですべての実際の処理を行っています。潜在的な IO 完了ポートを超えて、個別のスレッドは実行されていませんが、同時に複数の非同期 IO 操作を開始しています。

ここで考慮すべきもう 1 つの点は、これにより実際にはすべてが遅くなる可能性があるということです。同じ物理ディスク上で複数のファイルを処理している場合、ディスク IO の性質により、それらに順番にアクセスする方が高速になることがあります。ただし、ディスクの種類によって異なります (たとえば、SSD は「通常の」ディスクとは異なる動作をします)。

于 2013-03-02T23:02:20.887 に答える