序文: 単なる解決策ではなく、説明を求めています。私はすでに解決策を知っています。
タスクベースの非同期パターン (TAP)、async、および await に関する MSDN の記事を数日間勉強してきましたが、詳細についてはまだ少し混乱しています。
Windows ストア アプリ用のロガーを作成しており、非同期ログと同期ログの両方をサポートしたいと考えています。非同期メソッドは TAP に従います。同期メソッドはこれらすべてを隠し、通常のメソッドのように見えて機能する必要があります。
これは、非同期ロギングのコア メソッドです。
private async Task WriteToLogAsync(string text)
{
StorageFolder folder = ApplicationData.Current.LocalFolder;
StorageFile file = await folder.CreateFileAsync("log.log",
CreationCollisionOption.OpenIfExists);
await FileIO.AppendTextAsync(file, text,
Windows.Storage.Streams.UnicodeEncoding.Utf8);
}
今、対応する同期メソッド...
バージョン 1 :
private void WriteToLog(string text)
{
Task task = WriteToLogAsync(text);
task.Wait();
}
これは正しいように見えますが、機能しません。プログラム全体が永久にフリーズします。
バージョン 2 :
うーん..タスクが開始されていない可能性がありますか?
private void WriteToLog(string text)
{
Task task = WriteToLogAsync(text);
task.Start();
task.Wait();
}
これはスローしますInvalidOperationException: Start may not be called on a promise-style task.
バージョン 3:
うーん..Task.RunSynchronously
有望ですね。
private void WriteToLog(string text)
{
Task task = WriteToLogAsync(text);
task.RunSynchronously();
}
これはスローしますInvalidOperationException: RunSynchronously may not be called on a task not bound to a delegate, such as the task returned from an asynchronous method.
バージョン 4 (ソリューション):
private void WriteToLog(string text)
{
var task = Task.Run(async () => { await WriteToLogAsync(text); });
task.Wait();
}
これは機能します。したがって、2 と 3 は間違ったツールです。でも1?1 の何が問題で、4 の違いは何ですか? 1 がフリーズする原因は何ですか? タスク オブジェクトに問題はありますか? 明白でないデッドロックはありますか?