VS2012를 얻었고에 대한 핸들을 얻으려고했습니다 async
.
차단 소스에서 일부 값을 가져 오는 메소드가 있다고 가정 해 봅시다. 메소드 호출자가 차단하고 싶지 않습니다. 값이 도착하면 호출되는 콜백을 수행하는 메소드를 작성할 수 있지만 C # 5를 사용하고 있으므로 호출자가 콜백을 처리하지 않아도되도록 메소드를 비동기로 설정하기로 결정합니다.
// contrived example (edited in response to Servy's comment)
public static Task<string> PromptForStringAsync(string prompt)
{
return Task.Factory.StartNew(() => {
Console.Write(prompt);
return Console.ReadLine();
});
}
다음은이를 호출하는 예제 메소드입니다. 경우 PromptForStringAsync
비동기 아니었다,이 방법은 콜백 내에서 콜백을 중첩 필요합니다. 비동기를 사용하면이 방법을 매우 자연스럽게 작성할 수 있습니다.
public static async Task GetNameAsync()
{
string firstname = await PromptForStringAsync("Enter your first name: ");
Console.WriteLine("Welcome {0}.", firstname);
string lastname = await PromptForStringAsync("Enter your last name: ");
Console.WriteLine("Name saved as '{0} {1}'.", firstname, lastname);
}
여태까지는 그런대로 잘됐다. 문제는 GetNameAsync를 호출 할 때입니다 .
public static void DoStuff()
{
GetNameAsync();
MainWorkOfApplicationIDontWantBlocked();
}
요점은 GetNameAsync
비동기 적이라는 것입니다. MainWorkOfApplicationIDontWantBlocked ASAP로 돌아가서 GetNameAsync가 백그라운드에서 작동하도록하기 때문에 차단 하고 싶지 않습니다 . 그러나이 방법으로 호출하면 컴파일러 경고가 표시됩니다 GetNameAsync
.
Warning 1 Because this call is not awaited, execution of the current method continues before the call is completed. Consider applying the 'await' operator to the result of the call.
"통화가 완료되기 전에 현재 메소드의 실행이 계속된다"는 것을 완벽하게 알고 있습니다. 그것이 비동기 코드 의 요점 입니다. 맞습니까?
경고없이 컴파일하는 코드를 선호하지만, 코드가 의도 한대로 정확하게 수행하므로 여기에서 "수정"할 것은 없습니다. 반환 값을 저장하여 경고를 제거 할 수 있습니다 GetNameAsync
.
public static void DoStuff()
{
var result = GetNameAsync(); // supress warning
MainWorkOfApplicationIDontWantBlocked();
}
그러나 이제 불필요한 코드가 있습니다. Visual Studio는 정상적인 "사용하지 않은 값"경고를 표시하지 않기 때문에이 불필요한 코드를 작성해야한다는 것을 이해하고있는 것 같습니다.
비동기가 아닌 메서드에 GetNameAsync를 래핑하여 경고를 제거 할 수도 있습니다.
public static Task GetNameWrapper()
{
return GetNameAsync();
}
그러나 그것은 훨씬 더 불필요한 코드입니다. 따라서 불필요한 경고가 필요하지 않거나 허용하지 않는 코드를 작성해야합니다.
여기에 잘못된 비동기 사용에 관한 것이 있습니까?
GetNameAsync
예 (사용자가 제공 한 이름 제공 Task<Name>
, 오히려 단지를 돌아보다 Task
? DoStuff
그 작업을 저장할 수 있고, 하나 await
를 후 다른 방법, 또는 그 다른 작업을 통과를 방법 그래서 수 await
또는 Wait
내부 그것의 구현의 어딘가에.
async
키워드를 삭제하십시오 .
PromptForStringAsync
필요한 것보다 많은 작업을 수행합니다. 의 결과를 반환하십시오Task.Factory.StartNew
. 콘솔에 입력 된 문자열이 가치있는 작업입니다. 결과를 기다릴 필요가 없습니다. 그렇게하면 새로운 가치가 없습니다.