是否可以使用ThreadPool使用Callback?我可以使用尽可能多的BackgroundWorkers吗?

时间:2010-01-05 13:23:58

标签: .net multithreading

我知道Asycronous Delegates用于在.NET中实现回调功能。

我想知道

  1. 是否可以使用ThreadPool使用回调?
  2. 我可以使用尽可能多的BackgroundWorkers吗?我真正想知道的是,使用BackgroundWorker而不是ThreadPool / AsyncDelegates / Thread Class是否还有其他开销?

3 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:1)

回调已经在线程池线程上进行,它是.NET的默认设置。在你自己创建的Thread上制作一个会很尴尬。 BackgroundWorker的工作线程也来自线程池。

除了可用的Windows资源之外,您可以使用的BGW数量没有基本上限。但是,线程池管理器不会让它们全部同时运行,它会尝试确保CPU中没有与核心一样多的活动线程。只有当线程在合理的时间内没有完成时才允许运行更多的线程,直到ThreadPool.SetMaxThreads()设置的限制。你以某种方式射击你的脚的几率大致与你创建的线程数呈二次方式。

答案 2 :(得分:0)

BackgroundWorker是使用异步调用的委托实现的。异步调用的委托的目标方法在线程池的线程上执行。