2010-01-05 3 views
1

Asycronous Delegates가 .NET에서 콜백 기능을 구현하는 데 사용된다는 것을 알고 있습니다.ThreadPool을 사용하여 콜백을 사용할 수 있습니까? 가능한 한 많은 BackgroundWorkers를 사용할 수 있습니까?

내가

  1. 가 사용할 수를 알고 싶어 콜백 ThreadPool이를 사용하고 계십니까?
  2. 가능한 한 많은 BackgroundWorkers를 사용할 수 있습니까? 내가 정확히 알고 싶은 것은, ThreadPool/AsyncDelegates/Thread Class 대신 BackgroundWorker를 사용하는 데 따른 오버 헤드가 있습니까?
+0

정확히 무엇을하려합니까? 귀하의 질문에 그것은 당신이 여러 가지를 혼란스럽게 보입니다 ... –

+0

WinForms 프로젝트를 작성하고 있습니까? BackgroundWorker는 WinForms에서 백그라운드 작업을 실행하기위한 목적으로 만 사용됩니다. –

답변

1

(내가 제대로 이해하는 경우), 대답은 '예 : 나는 당신이 사용하는 호출 스레드에 다시 이벤트를 진행 상황을보고 처리 할 수있는 AsyncOperation 클래스를 찾고 완료 생각의 PostPostOperationCompleted 행동 양식. 이것이 후드 아래 BackgroundWorker의 작업입니다.

은 참조 : 콜백 이미 스레드 풀 스레드에서 만들어진 AsyncOperation Class

private AsyncOperation asyncOperation; 

public void DoSomethingAsync() 
{ 
    this.asyncOperation = AsyncOperationManager.CreateOperation(null); 
    ThreadPool.QueueUserWorkItem(s => this.DoSomethingImpl()); 
} 

private void DoSomethingImpl() 
{ 
    // report progress 
    this.asyncOperation.Post(new SendOrPostCallback(...), null); 

    // report complete 
    this.asyncOperation.PostOperationCompleted(new SendOrPostCallback(...), null); 
} 
0

BackgroundWorker는 비동기 적으로 호출되는 대리자를 사용하여 구현됩니다. 비동기 적으로 호출 된 대리자의 대상 메서드는 스레드 풀에서 스레드에서 실행됩니다. 첫 번째 질문에 대한 응답으로

1

, 그것은 .NET의 기본이다. 자신이 만든 실에서 하나를 만드는 것은 어색 할 것입니다. BackgroundWorker의 작업자 스레드는 스레드 풀에서도 제공됩니다.

사용 가능한 Windows 리소스 이상으로 사용할 수있는 BGW의 수에는 근본적인 상한선이 없습니다. 그러나 스레드 풀 관리자는 동시에 모든 스레드를 실행하지 않으므로 CPU에 코어가있는 것과 같은 활성 스레드가 절대로 존재하지 않도록합니다. 스레드가 적당한 시간 내에 완료되지 않는 경우에만 ThreadPool.SetMaxThreads()가 설정 한 한계까지 더 많은 스레드를 실행할 수 있습니다. 어떻게 든 발을 쏠 확률은 당신이 만든 스레드의 수와 대략 2 차적으로 올라갑니다.

관련 문제