22

그냥 다음 함수가 있다고 해봅시다.

public class Test
{
    public async Task Finalize()
    {
        // We don't need this in this class, so empty body
    }

    /*
     * Additional methods snipped
     */
}

이 작업은 정상적으로 작동하지만 다음과 같은 컴파일러 경고 메시지가 표시됩니다.

이 비동기 메서드는 'await'연산자가없고 동기식으로 실행됩니다. 'await'연산자를 사용하여 비 차단 API 호출을 기다리거나 'await Task.Run (...)'을 사용하여 백그라운드 스레드에서 CPU 바운드 작업을 수행하는 것이 좋습니다.

방법을 너무 많이 수정하지 않고이 경고를 우회하는 가장 좋은 방법은 무엇일까요? 이 경우 메서드를 호출 할 것이므로 예외를 throw 할 수는 없지만이 시점에서 아무 것도 발생하지 않을 것입니다. 왜냐하면 클래스에서 마무리 할 것이 없기 때문입니다.


  • async,public~와 함께 사용할 수 없습니다.interfaces - Sriram Sakthivel

5 답변


13

파일에 다음 지시문을 사용할 수 있습니다.

#pragma warning disable 1998

그러나 경고 만 남기고 조언을받는 것이 좋습니다. 그것은 좋은 이유에 대한 경고입니다;)

편집 : 만약 당신이 단 하나의 방법에 대한 경고를 해제하려면, 당신은 이것을 할 수 있습니다 :

#pragma warning disable 1998
async Task Foo() {}
#pragma warning restore 1998


  • 한 가지 기능이 아니라이 문제와 관련된 모든 컴파일러 경고를 비활성화 하시겠습니까? - Eisenhorn
  • #pragma warning restore ...를 사용하여 수정할 수 있습니다. - Eren Ersönmez
  • 이 방법은 실제 신체를 추가하지 않고도 꽤 잘 작동하는 것 같습니다. 두 답을 모두 옳은 것으로 표시하되 명예를 얻으십시오. 감사! - Eisenhorn
  • 경고는 당신이 어리석은 짓을 한 흔적입니다. 따라서 이름을 말하십시오. 어리석은 짓을 한 적이 없다는 것을 100 % 확신 할 때만 경고를 해제해야합니다. 문제의 코드가 어리 석으므로 경고를 사용하지 않도록 설정하면 상황이 더욱 악화되었습니다. 최소한 컴파일 할 때 바보 같은 코드라는 경고를하는 바보 같은 코드가 있습니다. 이제는 컴파일 할 때 '하지 마. - Jon Hanna
  • @ 존 나는 이미 답변에 경고를 가지고 있지만 좋은 생각인지 확신 할 수 없다 - 무시하는 것처럼 보인다.) - Eren Ersönmez

57

이렇게하면 컴파일러가 경고를 표시하지 않게됩니다.

관심있는 사람은 컴파일러 경고를 피할 필요가 있다면 다음과 같이하십시오.

public async Task DoStuff
{
    // This method should stay empty
    // Following statement will prevent a compiler warning:
    await Task.FromResult(0);
}


  • 여기 실제 응답. Pragma는 문제를 해결하기위한 마지막 방법이므로 시간이 지남에 따라 유지하기가 어렵습니다. 또한 코드에 주석을 달고 자신의 행동을 설명하십시오. - csaam
  • Yepp, Erens의 대답은 ' 음소거 ' 경고. 그래서 내 것이 실제로 조금 더 정확합니다. 그러나 나는 내 대답을 표시하는 아이디어를 싫어합니다 : P - Eisenhorn
  • 확실히 pragma가 마지막 도랑 노력이라고 말한 이유는 정확히 무엇인지에 대해 확신 할 수 없습니다. 경고가 있습니다. 경고에주의를 기울여 컴파일러에게 알리십시오. "이 항목은주의해야 할 부분이지만 실제로 필요합니다. " 나는 개인적으로 단순히 가짜 경고를 없애기 위해 가짜 작업을 기다리고있는 반면, 플러그 마를 사용하면 의도 한대로 정확하게 작업하고 있습니다. - Robba
  • 작업을 생성 한 다음 해당 작업을 기다리지 않아도되므로 해당 작업을 기다리는 작업을 생성 할 수 있습니다. 그냥async그리고await위와 같은 답변을 통해 동일한 서명과 일치하고 최적화되지 않은 무의미한 코드를 생성하지 않습니다. - Jon Hanna
  • 이 게시물은 .NET 4.6 이전에 작성되었으며 Task.CompletedTask를 제공합니다. - ZunTzu

32

이것은 비동기 인터페이스에 대해 동기 (또는 noop) 구현이있을 때 다소 일반적인 문제입니다.

당신은Task- 없이는 회귀 방법async완료된 키워드를 반환하기 만하면됩니다.Task, 같은 :

public Task FinalizeAsync()
{
  return Task.FromResult(0);
}

그러나 이것은 여전히Task그것이 불릴 때마다. 이 일을 많이하게되면 완료된 캐시를 원할 수 있습니다.Task예. 내 AsyncEx 라이브러리는작업 상수이 목적을 위해:

public Task FinalizeAsync()
{
  return TaskConstants.Completed;
}

마지막으로, 내 블로그 게시물을보고 싶을 수도 있습니다.비동기 처리몇 가지 대안 접근법에 대해.


  • 지금까지 최고의 대답은, 비록 누군가가 와서 그것을 지적하는 코멘트를 추가한다면async메소드의 실제 서명의 일부가 아니므로 호출 코드와 인터페이스 일치가 영향을받지 않으므로 완벽하게됩니다. - Jon Hanna
  • 이 게시물은 .NET 4.6 이전에 작성되었으며 Task.CompletedTask를 제공합니다. - ZunTzu
  • @JonHanna 아 해명 주셔서 감사합니다! 파생 클래스를 비동기식으로 구현할 수있는 빈 가상 메서드를 선언 할 때이 문제가 발생했습니다. 가상 메서드를 비동기 적으로 만들 수 없다는 것을 알지 못했습니다.async. - Toby J
  • 메소드가 비동기식 / 대기 형 접근법 또는 다른 태스크 생성 메소드로 태스크를 작성하는지 여부는 @ 구현에 달려 있습니다. 바깥 쪽에서는 아무런 차이가 없으며 모든 인터페이스가 고집 할 수 있습니다. - Jon Hanna

4

닷넷 4.6 이전에 우리는 이것을 할 필요가없는 가짜 값을 반환해야했습니다. 그러나 이제는 다음과 같이 할 수 있습니다.

public async Task MyFunctionAsync()
{
    // Some works here...
    await Task.CompletedTask;
}


  • 이 대답은 모든 것보다 낫습니다. - Anoop H.N
  • 나는 그것이 새롭고 간과하기 쉽다는 점에 동의한다. - Jessica Pennell

-1

"async"를 제거하면 경고 메시지가 사라집니다.

public class Test
{
    public void Finalize()
    {
        // We don't need this in this class, so empty body
    }
 }


  • 비동기를 제거하고 Task를 반환 할 수는 있지만 반환 유형을 변경하면 메서드를 외부 호출자로 변경하여 나중에 비동기를 도입하는 옵션을 제한 할 수 있습니다. - Yishai

관련된 질문

최근 질문