2017-11-29 8 views
1

가정 해 샘플 조각 :IO 작업에서 async/await의 기능은 무엇입니까?

public async void writeDataOnFile (byte[] data, string filePath) { 
    using(var fs = new FileStream(filePath)) { 
     await File.WriteAsync(data,0,data.length); 
    } 
} 

나는 어떤 배경 스레드가 스레드 풀에서 소비되지 않는 것을 알고 있지만 IO 작업이 시작됩니다 및 스레드가 마지막에 통보됩니다.

질문 : 어떻게하면 WriteAsync가 CPU 바인딩 방식이 아닌 IO 바인딩 방식인지를 async/await에서 이해할 수 있습니까?

도움을 주시면 감사하겠습니다.

+4

컴파일러는 전혀 이해할 필요가 없습니다. 'File.WriteAsync'에 의해 반환 된 작업이 완료 될 때 연속을 예약합니다. * 그것이 어떻게 완료되는지는'File.WriteAsync'의 구현에 달려 있습니다. –

+0

태스크가 I/O 또는 CPU 바인딩인지 여부를 신경 쓰지 않는 방법에 대한보다 실질적인 예는 https://msdn.microsoft.com/de-de/library/hh873178(v)를 살펴보면 도움이 될 것입니다. = vs.110) .aspx # EAP 이벤트 기반 작업 (다운로드가 시작되고 완료되면 알림)이 작업으로 변환 될 수있는 간단한 예제를 보여주는 위치. 비슷한 점이 WriteAsync에 의해 수행됩니다.이 경우 내부적으로 OS는 작업이 완료되면 콜백마다 알립니다. – ckuri

+2

또한 "아무 배경 스레드도 스레드 풀에서 소비되지 않습니다." 나는 특히 스레드 풀에 대해 신경 쓰지 않았기 때문에이 문장이 정확한지 확신 할 수는 없지만 99 % 정도의 백그라운드 스레드가 사용되었다고 확신한다. 기술적으로 정확한지 여부에 관계없이 해당 진술에서 잘못된 정보를 추측 할 수있는 것처럼 느껴집니다. 아니 그 특히에 대해 걱정하는 '기다리는'... – zzxyz

답변

3

질문 : WriteAsync가 CPU 방법이 아닌 IO 방법임을 async/await에서 어떻게 이해합니까?

await 키워드는 IO 또는 CPU 바운드인지 여부에 상관하지 않습니다. 그것이 염려하는 것은 "전화"가 기다릴 수 있다는 것입니다. 자세한 내용은 here을 참조하십시오.

await 15; 

이 더 좋은 예는 있지만, 적어도이 점을 보여줍니다 지금

public static class ThisWorks 
{ 
    public static System.Runtime.CompilerServices.TaskAwaiter GetAwaiter(this Int32 millisecondsDue) 
    { 
     return TimeSpan.FromMilliseconds(millisecondsDue).GetAwaiter(); 
    } 

    private static System.Runtime.CompilerServices.TaskAwaiter GetAwaiter(this TimeSpan timeSpan) 
    { 
     return Task.Delay(timeSpan).GetAwaiter(); 
    } 
} 

우리는이 작업을 수행 할 수있는 사용 :

확장 방법은 TaskAwaiter 반환 경우 아래의 예를 참조하십시오 .