Implementing an interface that requires a Task return type in synchronous code과 유사하지만 컴파일러 오류를 무시해야하는지 궁금하지만 내 상황이 대신 생성됩니다.작업을 반환하는 인터페이스의 동기 구현
public interface IAmAwesome {
Task MakeAwesomeAsync();
}
async
및 await
를 사용하여 비동기 적으로 수행되는 멋진 혜택을 일부 구현에서 :
의 나는이 같은 인터페이스를 가지고 있다고 가정 해 봅시다. 이것은 실제로 인터페이스가 허용하려고 시도하는 것입니다.
경우에 따라서는 드문 경우지만 멋진 동기화 방법 만 있으면 멋지게 만들 수 있습니다. 그럼 구현이 같다고 가정하자 :
public class SimplyAwesome : IAmAwesome {
public async Task MakeAwesomeAsync() {
// Some really awesome stuff here...
}
}
이 작동하지만, 컴파일러는 경고한다 :
이 방법은 '기다리고'연산자를 부족하고 동 기적으로 실행됩니다. 연산자를 사용하여 비 블로킹 API 호출 인 또는 'await TaskEx.Run (...)'을 기다려 백그라운드 스레드에서 CPU 바운드 작업을 수행하는 것이 좋습니다. 나는이 컴파일러 경고를 무시하도록 선택할 때 무엇을 결정해야한다 -
public class SimplyAwesome : IAmAwesome { public async Task MakeAwesomeAsync() { await Task.Run(() => { // Some really awesome stuff here, but on a BACKGROUND THREAD! WOW! }); } }
내 질문은 :
컴파일러는 실제로이 솔루션을 제안한다? 어떤 경우에는 작업이 너무 간단하여 스레드를 생성하는 것이 명백히 비생산적입니다.
당신이해야할 일은'public interface IAmAwesome { Task MakeAwesomeAsync();입니다. void MakeAwesome(); } '이므로 비동기 및 동기 메서드가 노출됩니다.그러나 현실 세계에서 실용적인 것이 다른 이야기입니다. –
저는 비동기가 아닌 작업을하는 이유가 무엇인지 궁금합니다. 구체적인 유스 케이스를 제공 할 수 있습니까? – JLRishe
@JLRishe 일반적인 경우는 때로는 캐시 될 수있는 일을하는 것입니다. "캐시에서 가져 오기"버전은 동기식 일 수 있으며 캐시 미스 버전은 비동기식입니다. – Servy