19

TPL TaskFactory.FromAsync을 사용하고 TaskFactory.StartNew을 사용하는 것 사이에 성능에 영향이 있는지 궁금 해서요. 100 개 이상의 동시 연결을 지원하는 TCP 서버를 작성 중입니다. 첫번째 옵션이 & 인 코드를 작성한 후 여러 번 읽는 작업을 계속하려면 & 쓰기 작업을 계속하면 코드를 디버그하기가 어렵습니다.TPL TaskFactory.FromAsync와 차단 방법이있는 작업

동기화 버전 &으로 코드를 작성한 다음 작업으로 래핑하면 복잡성이 줄어 듭니다. & 테스트 가능성이 증가하지만 성능 향상에 대해 걱정됩니다. 예를 들어

, 이들 두 통화 사이의 성능 차이가 있습니다 : API를이 방법의 BeginXXX/EndXXX 버전을 제공 할 때

NetworkStream stream; 
byte[] data; 
int bytesRead; 

//using FromAsync 
Task<int> readChunk = Task<int>.Factory.FromAsync (
     stream.BeginRead, stream.EndRead, 
     data, bytesRead, data.Length - bytesRead, null); 

//using StartNew with blocking version 
Task<int> readChunk2 = Task<int>.Factory.StartNew(() => 
     stream.Read(data, bytesRead, data.Length - bytesRead)); 

답변

45

당신 절대적으로FromAsync를 사용하고 싶습니다. 차이점은 Stream 또는 Socket 또는 WebRequest과 같은 경우에는 여러 개의 CPU를 차단하는 것보다 훨씬 효율적인 커버 (예 : Windows의 I/O 완료 포트) 아래에 비동기 I/O를 사용하게됩니다. 동기 작업을 수행하는 스레드. 이러한 방법은 I/O 확장 성을 달성하는 가장 좋은 방법을 제공합니다.

비동기 너바나를 달성하기 위해이 두 프로그래밍 모델을 결합하는 방법에 대한 자세한 내용은 TPL and Traditional .NET Asynchronous Programming이라는 MSDN의 .NET SDK 섹션을 확인하십시오. 외장 링크를 복사 후

+1

당신이 웹 메소드를 호출하는 말을 어떤 소스가 있나요 (예를 들어) Async와 함께 Begin/End를 사용하는 것이 Async와 함께 동기 버전을 사용하는 것보다 낫습니다. 당신이 말하는 것은 의미가 있습니다, 나는 단지 그것을 어딘가에 공식적으로 읽는 것을 좋아합니다. –

5

:

예. .NET 4에서 Task Parallel Library에는 APM 패턴 (Begin/End) : Task.Factory.FromAsync에 대한 래퍼 이 내장되어 있습니다. 당신이 스트림의 그러면 BeginRead/EndRead 메소드의 호출을위한 작업을 만들고 싶었 예를 들어, , 당신은 할 수 :

Stream s = ...; 
byte [] buffer = ...; 
Task<int> numBytesRead = Task<int>.Factory.FromAsync(s.BeginRead, s.EndRead, buffer, 0, buffer.Length, null); 
// or with await 
int numBytesRead = await Task<int>.Factory.FromAsync(s.BeginRead, s.EndRead, buffer, 0, buffer.Length, null); 

Under the covers, FromAsync is just built on top of TaskCompletionSource<TResult>. A simple version of FromAsync for this read example would look something like: 

var tcs = new TaskCompletionSource<TResult>(); 
s.BeginRead(buffer, 0, buffer.Length, iar => 
{ 
    try { tcs.SetResult(s.EndRead(iar)); } 
    catch(Exception exc) { tcs.SetException(exc); } 
}, null); 
Task<int> numBytesRead = tcs.Task; 

http://social.msdn.microsoft.com/Forums/en/async/thread/ed8a14e8-d19a-42d1-bc3f-7017bdfed09c

+3

외부 링크의 내용을 입력하십시오. 그렇지 않으면 링크가 끊어지면 답이 무의미합니다. – sra

+2

msdn이 중단되면 우리는 모두 쓸모가 없습니다. –