謎を解き明かしましょう: File.ReadAllLinesAsync()
WPF UI スレッドがブロックされる理由
はじめに
WPF で非同期プログラミングを使用する場合、特定のメソッドが UI スレッドをブロックする理由を理解することが重要です。 File.ReadAllLinesAsync()
はそのようなメソッドの 1 つであり、その予期せぬ動作により開発者の間で疑問が生じました。この記事では、この問題の背後にある理由を詳しく調べ、考えられる解決策を検討します。
質問
File.ReadAllLinesAsync()
は、テキスト ファイルの内容を非同期に取得するための非同期メソッドです。ただし、WPF アプリケーションでこのメソッドを使用すると、次のコード スニペットに示すように、UI スレッドがブロックされる可能性があります。
<code class="language-csharp">private async void Button_OnClick(object sender, RoutedEventArgs e) { Button.Content = "Loading..."; var lines = await File.ReadAllLinesAsync("D:\temp.txt"); // 阻塞 UI 线程 Button.Content = "Show"; }</code>
説明
UI スレッドをブロックする理由は、.NET Core 3.1 の非同期ファイル操作の内部実装にあります。非同期メソッドの推奨設計原則に反して、このメソッドはタスクを返す前に多くの同期作業を実行します。この同期には、ファイル アクセスの初期化、メモリの割り当て、ファイルの内容のメモリへのロードが含まれます。したがって、これらのタスクの実行中、UI スレッドはブロックされます。 File.ReadAllLinesAsync()
パフォーマンスへの影響
この問題によるパフォーマンスへの影響を説明するために、大きなテキスト ファイルの読み取りを含む簡単なテストを実行できます。結果 (ミリ秒単位) は次のとおりです:
<code class="language-csharp">Task<string> task = File.ReadAllLinesAsync("LargeFile.txt"); long duration1 = stopwatch.ElapsedMilliseconds; bool isCompleted = task.IsCompleted; stopwatch.Restart(); string[] lines = await task; long duration2 = stopwatch.ElapsedMilliseconds;</code>
出力
<code>创建: 450 毫秒, Task.IsCompleted: False 等待: 5 毫秒, 行数: 204,000</code>出力からわかるように、
は不完全なタスクを返す前に、ほぼ 0.5 秒 (450 ミリ秒) UI スレッドをブロックします。後続の File.ReadAllLinesAsync()
操作は非常に迅速に完了し、所要時間はわずか 5 ミリ秒です。 await
考えられる解決策
この問題を解決するには、次の代替案を検討してください:
同期 メソッドを使用します。 File.ReadAllLines()
このメソッドは同期的ですが、UI スレッドのブロックを回避します。その呼び出しを でラップすると、確実に非同期で実行されます。 Task.Run
<code class="language-csharp"> var lines = await Task.Run(() => File.ReadAllLines("LargeFile.txt"));</code>
より効率的な非同期ファイル アクセス機能を備えたサードパーティ ライブラリの使用を検討してください。 や などの System.IO.Pipelines
ライブラリは、ファイル操作の非同期パフォーマンスを向上させるように設計されています。 DotNetReactor.IO
結論
.NET Core 3.1 の実装の非効率性により、 は WPF アプリケーションの UI スレッドをブロックします。この問題は、UI の応答性に悪影響を与える可能性があります。同期または最適化されたサードパーティ ソリューションを活用することで、この潜在的なボトルネックを回避し、スムーズなユーザー エクスペリエンスを確保できます。 File.ReadAllLinesAsync()
以上がFile.ReadAllLinesAsync() が WPF アプリケーションの UI スレッドをブロックするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。