0

저는 비동기 C# 코딩에 익숙하며 Azure 테이블에는 sync + async 호출을 선택할 수 있습니다. 1) 나는 내 메소드에서 엔티티를 가져와야하고 2) 스레드가 그 동안 할 수있는 다른 것을 가지고 있지 않다면, 아래에 비동기 버전의 코드를 사용하는 이유가 무엇입니까? 스레드가 다른 작업을 할 수있게하여 멀티 스레드 응용 프로그램에 처리량을 추가 할 수 있습니까? 동기 호출이 얼마나 "깊숙이"차단되는지는 확실하지 않습니다. 하늘빛 테이블에서 반응을 얻으려면 300ms 이상 걸리는 경우가 있습니다.푸른 색 테이블 API- ExecuteAsync를 사용해야합니까

문맥에서 광자 소켓 서버 구현을 코딩합니다. 스레드 풀과 Fibers를 사용합니다. 나는 그러나이 같은 광자에서 비동기 호출을 사용,이 같은 인터페이스 (더 비동기 이벤트가 없습니다) protected override void OnOperationRequest(OperationRequest o, SendParameters p) 은 내가 할 수있는 구현 오전 : requestFiber.Enqueue(() => DoStuff;);

/* synchronous version of code fragment */ 

entity = tableRetryPolicy.ExecuteAction(() => { 
    var result = table.Execute (retrieveOp); 
    if(result.HttpStatusCode == 404) 
    return null; 
    App.CheckHttpStatusCode ("Get (Table) Retrieve", result, 200); 
    return (T) result.Result; 
}); 

/* async version of code fragment */ 
var task = tableRetryPolicy.ExecuteAsync(() => 
    table.ExecuteAsync (retrieveOp).ContinueWith(t => 
    { 
     if (t.Exception != null) 
     { 
     // non-transient exception occurred or retry limit reached 
     App.log.Error("Get (Table) failed all retries: entityId: " + entityId); 
     } 
     else 
     { 
     if(t.Result.HttpStatusCode == 404) 
      return; 
     App.CheckHttpStatusCode ("Get (Table) Retrieve", t.Result, 200); 
     entity = (T) t.Result.Result; 
     } 
    } 
)); 
task.Wait(); 
//^dont have anything else we can do with this execution path, except wait! 

답변

1

이것은 일반적인 닷넷 스레딩 문제의 더 많은 것이다. 노출 된 저장소 api는 실제로 동기식 및 비동기식입니다. 즉, Sync 메서드가 호출 스레드를 차단하고 해당 스레드에서 모든 작업을 수행하지만 비동기식은 IO 완료 포트/calblacks를 사용하지 않습니다. 비동기 스토리지 api는 선점 취소 및 선행 제한 시간을 허용하여 성능 요구 사항이 엄격한 경우 도움을 줄 수 있습니다 (요청 옵션 시간 초과 속성 참조).

고려해야 할 가장 큰 사항은 애플리케이션에서 소비해야하는 스레드 수입니다. 어떤 구현/스택에 관계없이 요청 당 1 개의 쓰레드를 사용하면 더 많은 시간/메모리 스레딩 쓰레드를 사용하므로 최대 동시 요청 수는 1,000 개로 늘어납니다. (이것은 캐시에도 좋지 않습니다.) 스레딩에 관한 의견은 상당히 다양하지만 일반적으로 실제 성능/높은 규모의 응용 프로그램에서는 스레드를 거의 사용하지 않고 (논리적 프로세서의 수는 대략 두 배입니다) 비동기 요청은 많은 스레드가있는 스레드보다 훨씬 높고 선형입니다. & 동기식 이행.

+0

감사합니다. Joe! 위의 코드 예제에서 task.Wait()은 스레드를 자유롭게 해제하여 table.Execute()가 스레드를 완전히 차단하지만 다른 작업은 수행하도록 할 것입니까? –

관련 문제