2016-06-22 2 views
0

컴파일러의 경고 프로젝트를 정리하는 작업이 있습니다. 현재 나는 ASP.NET과 Xamarin을위한 솔루션에 사용되는 CS 파일 작업을하고 있습니다. 자 마린 솔루션에전 처리기 지시문을 사용하여 비동기 메서드에서 예외를 throw하는 중

public override async SomeReturnTypeItem LoginAsync() 
    { 
#if __MOBILE__ 
     throw new NotSupportedException("Windows authentication is not supported in mobile version"); 
#endif 
    //some code 
    } 

내가 #endif으로 경고 그 코드에 연결할 수 있습니다 : 나는 방법이 있습니다. #endif#else으로 바꾸고 방법 끝까지 #endif을 입력하면 메서드에 await 연산자가없고 동 기적으로 실행된다는 경고가 나타납니다. 이 방법을 경고없이 어떻게 만들 수 있습니까?

+1

당신은 무엇을 기대 했느냐? '* __MOBILE__'이 설정되면 코드 *에 도달 할 수 없습니다. 예외와 그 이후의 코드는 실행되지 않습니다. 경고를 원하지 않는다면, 코드를 제거하거나'# else' 지시자를 사용하십시오. –

+1

"메소드가 작동하지 않습니다"라는 경고 메시지가 나타나면'async' 키워드가 없어야합니다. 두 버전 모두 가능합니다. –

+0

"일부 코드"에'await'이 있다고 가정 할 때 안전합니까? –

답변

0

제가 사용한 해결책은 컴파일러를 속이는 것입니다.

public override async SomeReturnTypeItem LoginAsync() 
    { 
#if __MOBILE__ 
     bool isMobile = true; 
     if (isMobile) 
     { 
      throw new NotSupportedException("Windows authentication is not supported in mobile version"); 
     } 
#endif 
     //some async code 
    } 

비주얼 Stuidio 비동기 코드가 경험적으로 연결할 수 있지만, 컴파일러는 만족 말합니다. 물론 조금 추해 보이지만 작동합니다. 그러나 도와 줘서 고맙다고 너희들)

0

그것은 좀 추한,하지만 당신이 할 수 있습니다 : 이것은 가정입니다

public override 
#if !__MOBILE__ 
    async 
#endif 
    SomeReturnTypeItem LoginAsync() { 
#if __MOBILE__ 
    throw new NotSupportedException("Windows authentication is not supported in mobile version"); 
#else 
    //some code 
#endif 
    } 

당신이 실제로 "일부 코드"어딘가에 await 키워드를 가지고있다. 그렇지 않다면 async을 삭제해야합니다. #pragma warning

+0

문제는'async'가 아니다.'throw' * 이후의 어떤 코드도 * 도달 할 수 없다. * –

+0

@PanagiotisKanavos 그의 수정과 함께 사용하기위한 것이다 :'#else ... #endif'. 나는 그것을 더 분명하게하기 위해 편집했다. –

2

간단한 수정

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); 
} 
+0

이 답변의 두 번째 부분이 최선의 해결책이라고 생각합니다. – Neil

+0

그러나 첫 번째 부분은 질문에서 언급했듯이 이미 시도했지만 다른 경고를하기 때문에 잘못되었거나 불완전합니다. –

관련 문제