TaskCompletionSource
의 목적과 비동기/스레드없는 작업의 관계를 이해하려고합니다. 나는 일반적인 생각을 가지고 있다고 생각하지만 나의 이해가 올바른지 확인하고 싶다.TaskCompletionSource - 스레드가없는 비동기 작업을 이해하려고 시도합니다.
처음에는 TPL (Task Parallel Library)을보고 스레드가없는/비동기 작업을 만들 수있는 좋은 방법이 있는지 알아보기 시작했습니다 (ASP.NET 사이트의 확장 성을 높이기 위해 노력하고 있다고 가정). TPL에 대한 이해는 미래에 매우 중요해 보입니다 (async
/await
). 어느 날 TaskCompletionSource
으로 안내했습니다.
제 생각에 클래스 중 하나에 TaskCompletionSource
을 추가하는 것이 실제로 비동기 코딩을 많이하지는 않습니다. 여전히 동기화 코드를 실행중인 경우 코드 호출이 차단됩니다. 나는 이것이 마이크로 소프트 API의 경우조차도 마찬가지라고 생각한다. 예를 들어, WebClient
클래스에서 벗어난 DownloadStringTaskAsync
에서 처음에 수행하는 설정/동기화 코드는 차단됩니다. 실행중인 코드는 현재 스레드 또는 일부 스레드에서 실행해야합니다. 그렇지 않으면 새 스레드를 실행해야합니다.
Microsoft에서 async
다른 호출을 호출 할 때 사용자 코드에서 TaskCompletionSource
을 사용하므로 클래스 클라이언트가 클래스가 차단하지 않을 새 스레드를 만들지 않아도됩니다.
Microsoft가 비동기 API를 내부적으로 수행하는 방식을 잘 모릅니다. 예를 들어 .Net 4.5에 대해 SqlDataReader
에서 벗어난 새로운 async
방법이 있습니다. IO 완료 포트가 있다는 것을 알고 있습니다. 아마도 C# 개발자들이 사용하지 않을 낮은 수준의 추상화 (C++?)라고 생각합니다. 입출력 완료 포트가 데이터베이스 또는 네트워크 호출 (HTTP)에 대해 작동하는지 아니면 파일 입출력에만 사용되는지는 확실하지 않습니다.
질문에 대한 답은 정확합니까? 내가 잘못 표현한 것들이 있습니까?
: 우리는 오류 또는 과도한 자원 소모없이 한 번 에서 이러한 작업 만 시작하여이를 증명할 수 ? –
제 이해가 정확하다면 ... 확실하지 않거나 없습니까? – coding4fun