간단한 수정
public override async SomeReturnTypeItem LoginAsync()
{
#if __MOBILE__
throw new NotSupportedException("Windows authentication is not supported in mobile version");
#else
//some code using await
#endif
}
것이다 그러나 __MOBILE__
경우 때문에 즉, 아마 정확하게 당신이 원하는 행동이 아니다 :
또는는 단순히 경고를 억제하기 위해 #pragma
지시어를 사용할 수 있습니다 이 메서드는 즉시 throw하는 대신 오류가있는 Task
을 반환합니다. 그 차이는 때로는 즉시 대기하는 대신 나중에 Task
을 저장하여 (예를 들어 여러 작업을 시작하여 동시에 실행할 수 있도록하려는 경우) 대용량을 표시 할 수 있습니다.
이 문제를 해결하려면, 당신은 다른의 방법에서 예외 던지는 코드와 비동기 구현을 넣어해야합니다 : 물론
public override SomeReturnTypeItem LoginAsync()
{
#if __MOBILE__
throw new NotSupportedException("Windows authentication is not supported in mobile version");
#else
return LoginAsyncImpl();
#endif
}
private async SomeReturnTypeItem LoginAsync()
{
//some code using await
}
, 당신은 await
를 사용하지 않을 경우 모두, 당신은 단지 안 귀하의 방법을 async
으로 표시하십시오!
public override omeReturnTypeItem LoginAsync()
{
#if __MOBILE__
throw new NotSupportedException("Windows authentication is not supported in mobile version");
#else
//some code not using await
#endif
}
주 비 비동기 코드는 여전히 Task
를 반환 할 수있다. 일부 메소드가 태스크를 리턴하도록 인터페이스 또는 기본 클래스를 구현하면 구현이 실제로 비동기가 될 수 있지만 특정 구현은 동기가 발생하는 경우에 유용합니다.
public override Task SomeMethodAsync()
{
// do some synchronous stuff
return Task.FromResutl(true);
}
당신은 무엇을 기대 했느냐? '* __MOBILE__'이 설정되면 코드 *에 도달 할 수 없습니다. 예외와 그 이후의 코드는 실행되지 않습니다. 경고를 원하지 않는다면, 코드를 제거하거나'# else' 지시자를 사용하십시오. –
"메소드가 작동하지 않습니다"라는 경고 메시지가 나타나면'async' 키워드가 없어야합니다. 두 버전 모두 가능합니다. –
"일부 코드"에'await'이 있다고 가정 할 때 안전합니까? –