그냥 다음 함수가 있다고 해봅시다.
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 할 수는 없지만이 시점에서 아무 것도 발생하지 않을 것입니다. 왜냐하면 클래스에서 마무리 할 것이 없기 때문입니다.
파일에 다음 지시문을 사용할 수 있습니다.
#pragma warning disable 1998
그러나 경고 만 남기고 조언을받는 것이 좋습니다. 그것은 좋은 이유에 대한 경고입니다;)
편집 : 만약 당신이 단 하나의 방법에 대한 경고를 해제하려면, 당신은 이것을 할 수 있습니다 :
#pragma warning disable 1998
async Task Foo() {}
#pragma warning restore 1998
이렇게하면 컴파일러가 경고를 표시하지 않게됩니다.
관심있는 사람은 컴파일러 경고를 피할 필요가 있다면 다음과 같이하십시오.
public async Task DoStuff
{
// This method should stay empty
// Following statement will prevent a compiler warning:
await Task.FromResult(0);
}
async
그리고await
위와 같은 답변을 통해 동일한 서명과 일치하고 최적화되지 않은 무의미한 코드를 생성하지 않습니다. - Jon Hanna
이것은 비동기 인터페이스에 대해 동기 (또는 noop) 구현이있을 때 다소 일반적인 문제입니다.
당신은Task
- 없이는 회귀 방법async
완료된 키워드를 반환하기 만하면됩니다.Task
, 같은 :
public Task FinalizeAsync()
{
return Task.FromResult(0);
}
그러나 이것은 여전히Task
그것이 불릴 때마다. 이 일을 많이하게되면 완료된 캐시를 원할 수 있습니다.Task
예. 내 AsyncEx 라이브러리는작업 상수이 목적을 위해:
public Task FinalizeAsync()
{
return TaskConstants.Completed;
}
마지막으로, 내 블로그 게시물을보고 싶을 수도 있습니다.비동기 처리몇 가지 대안 접근법에 대해.
async
메소드의 실제 서명의 일부가 아니므로 호출 코드와 인터페이스 일치가 영향을받지 않으므로 완벽하게됩니다. - Jon Hannaasync
. - Toby J
닷넷 4.6 이전에 우리는 이것을 할 필요가없는 가짜 값을 반환해야했습니다. 그러나 이제는 다음과 같이 할 수 있습니다.
public async Task MyFunctionAsync()
{
// Some works here...
await Task.CompletedTask;
}
"async"를 제거하면 경고 메시지가 사라집니다.
public class Test
{
public void Finalize()
{
// We don't need this in this class, so empty body
}
}
async
,public
~와 함께 사용할 수 없습니다.interfaces
- Sriram Sakthivel