서문 : 해결책이 아니라 설명을 찾고 있습니다. 나는 이미 해결책을 알고 있습니다.
태스크 기반 비동기 패턴 (TAP), 비동기 및 대기에 관한 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이 얼게하는 이유는 무엇입니까? 작업 개체에 문제가 있습니까? 명백한 교착 상태가 있습니까?