다른 async
메서드 (.NET 5.0 async
키워드 사용) 내에서 메서드를 호출하는 것이 좋습니다. 나는 당신의 질문을 완전히 이해하고 있는지 확신 할 수 없지만, 다음의 간단한 예를 들어보십시오. 해야 모호한 우리가 async
수정을 치료하는 컴파일러를 알려줍니다
Task<int> GetPrimesCountAsync(int start, int count)
{
return Task.Run(() =>
ParrallelEnumerable.Range(start, count).COunt(n =>
Enumerable.Range(2, (int)Math.Sqrt(n) - 1).All(i => n % i > 0)));
}
여기
async void DisplayPrimes()
{
int result = await GetPrimesCountAsync(2, 10000);
Console.WriteLine(result);
}
오히려 식별자보다 키워드로 기다리고 쓸 수 시작 int
와 카운트 사이의 소수를 표시하려면 그 방법 안에서 발생한다. 이렇게하면 C# 5.0 이전에 작성된 코드가 식별자로 기다릴 수 있으므로 오류없이 컴파일됩니다. 비동기 한정자는 void 또는 Task
/Task<TResult>
을 반환하는 메서드 및 람다 식에만 적용 할 수 있습니다.
await
표현식이 발생하면 실행자는 반복자에서 yeild return
과 같이 호출자에게 반환됩니다. 하지만 돌아 오기 전에 런타임은 기다린 작업에 계속 작업을 연결하여 작업이 완료되면 실행이 다시 중단 된 지점에서 계속 실행되도록합니다. 위의 방법으로 컴파일러에서 변환 한 내용을 표시 할 수 있다고 가정합니다.
void DisplayPrimesCount()
{
var awaiter = GetPrimesCountAsync(2, 100000).GetAwaiter();
awaiter.OnCompleted(() =>
{
int result = awaiter.GetResult();
Console.WriteLine(result);
});
}
이 정보가 도움이되기를 바랍니다.
편집. 그래서 작업 차단을 방지하기 위해, 당신은 당신이
private async Task<bool> TestAsync()
{
return await Task.Run(() =>
{
// Do stuff non-blocking.
return true;
}).ConfigureAwait(continueOnCapturedContext:false);
}
여기 TestAsync
것이다 '수준까지'만들려는 async
과정을 가지고해야합니다 (당신이 어떤 코드를 게시하지대로 사건이 무엇인지 이야기하기 어렵다) UI 컨텍스트 대신 스레드 풀 스레드에서 "return"문을 실행하여 완료 할 수 있어야합니다. 그러면 발신자에게 즉시 반환되지만, 계속 Task.Result
을 사용하면 어떤 예외도 AggregateException
에 싸여 져서 처리해야합니다.
좋은 설명은 on MSDN here입니다. async
/await
에 들어가기 전에 C# 4.0 Tasks에 대해 배우기를 권합니다. 동시성을 더 잘 이해할 수 있습니다.
하지만 task.Run을 사용하면 새 스레드가 생깁니다. 잘못이 아니라면 새 스레드가 생기고 더 많은 자원을 사용하고 확장 성이 떨어지기를 피하려고합니다. 새 스레드를 만들지 않고 작업에서 코드를 실행할 수 있습니까? –
어디에서 코드를 실행할 것입니까? –
참. 그런 다음 killercam과 같은 코드를 사용하면 doinf이고 비동기 메서드를 만드는 작업에서 sync 메서드를 래핑하는 것과 같습니다. 이것이 사실이라면 내 게시물의 기사에서 autor는 이것이 좋은 습관이 아니라고 말합니다. –