2013-11-04 5 views
4

another SO question에서 배경 스레드에서 동기 요청을 보내지 않고 비동기 네트워크 요청을 보내도록 권고 받았습니다. 그 이유는 내가 쓰레기를 낭비하지 않도록하기 위해서였습니다. 나는 이것이 어떻게 그렇게되는지 이해하려고 노력하고있다.스레드를 저장하기위한 비동기 WCF 호출?

이것은 원래 접근 방식입니다. 어떻게 두 개의 스레드가 여기에 있는지 이해할 수 있습니다. 하나는 메인 스레드 (1)이고, 다른 하나는 백그라운드 스레드 (Task.Run) (2) WCF 호출을 것입니다 : 이것은 제안 된 접근 방식의 내 스케치

enter image description here

입니다. 스레드가 저장되는 방식을 이해하려고합니다. 비동기 WCF 호출 후 비동기 WCF 호출에서 콜백을 위해 다른 스레드를 만들지 않습니까?

enter image description here

아마 단 하나 개의 스레드가 콜백 처리가 필요하지 않은 경우 사용되며, 더이 생각 후?

+0

어떤 종류의 클라이언트 응용 프로그램을 쓰고 있습니까? –

+0

@JonSkeet WPF 클라이언트입니다. –

+1

비동기 네트워크 호출에서 호출을 실행중인 스레드가 없습니다. (귀하의 UI 스레드는 정상적으로 UI 메시지를 처리하고 실행 중임) – SLaks

답변

2

WPF 클라이언트에서 클라이언트 어딘가에 OnClick이있을 가능성이 있으며, 클라이언트가 클릭되었는지 여부를 확인하는 스레드는 어디입니까?

OS 자체가 클릭을 확인한 후 메시지를 메시지 펌프로 전달하여 차례대로 사용자의 기능을 호출합니다. WCF 함수에 대한 콜백은 마치 OS 자체가 응답 메시지를 수신하고 스레드가 메시지를 받으면 스레드 풀에서 자유 스레드를 찾고 그 시점에 콜백을 실행하는 신호를 보냅니다.

동기 실을 잡고 콜백 방법은 마지막 스레드를 생성시키는 주요 차이점은 스레드 풀 사실이다. 쓰레드 풀의 쓰레드가 작업을 끝내면 파손되지 않고 잠시 기다렸다가 더 많은 작업을 할 수 있는지 알아보기 위해 이 새 작업을 수행하기 위해으로 재사용됩니다.

은 그래서 두 가지 선택이

  • 1 개 스레드 (동기화 + 스레드)
  • 재사용 이미 작업의 완료 기존 스레드 차단을 해제하는 기능을 기다리는 다른 일을하지 기다리고 거기에 앉아 가지고있다 (아무도 대기 중이 아니며 우리가 대기 중이던 정보를 알려주는 경우에는 ThreadPool.GetMaxThreads()) 새 메시지를 생성하고, 콜백을 처리하는 짧은 작업을 제공 한 다음 스레드를 풀로 다시 보냅니다 다른 콜백이 들어올 때 다른 작업을 수행 할 수 있습니다.
+0

좋아요, 이제 이걸 이해할 것 같아요. 두 개의 스레드가 여전히 사용되며, 백그라운드 스레드의 동기화 요청에서 스레드는 WCF 동기화 호출이 완료 될 때까지 기다리고 있습니다. 비동기 WCF 호출에는 대기가 없습니다. 그게 맞는 것 같니? –

+0

수정. 동기화 버전에서는 ThreadPool에서 스레드를 묶는 위치를 지정합니다 ([LongRunning] (http://msdn.microsoft.com/en-us/library/system.threading.tasks.taskcreationoptions. aspx) 그것은 스레드 풀 스레드를 사용합니다.) 그리고 ThreadPool에서 응답을 기다리는 스레드를 사용하는 것 외에는 아무것도하지 않았습니다.비동기 메소드를 사용하면 응답이 돌아올 때까지 스레드를 풀에서 비울 수 있습니다. (모든 비동기 메서드가 ThreadPool 스레드를 사용하는 것은 아니며 콜백을 처리하는 일반적인 방법 일뿐입니다.) –

+0

이것이 내가 필요한 것입니다. 고마워, 스캇! –

관련 문제