起初我有线程等待的例子,它完美无缺。它的工作是要求100个线程等待3秒然后输出:
for (int i = 0; i < 100; ++i)
{
int index = i;
Thread t = new Thread(() =>
{
Caller c = new Caller();
c.DoWaitCall();
}) { IsBackground = true };
t.Start();
}
Caller :: DoWaitCall()看起来像:
public void DoWaitCall()
{
Thread.Sleep(3000);
Console.WriteLine("done");
}
在这种情况下,所有线程都会等待3秒,几乎同时给出输出消息。
但是当我尝试使用Async回调来执行Console.WriteLine时:
public void DoWaitCall()
{
MyDel del = () => { Thread.Sleep(3000); };
del.BeginInvoke(CallBack, del);
}
private void CallBack(IAsyncResult r)
{
Console.WriteLine("done");
}
每个线程等待不同的时间,并慢慢地逐个输出。 有没有什么好方法可以并行实现异步回调?
答案 0 :(得分:2)
你看到的效果是ThreadPool
逐渐增加,基本上。这个想法是创建(然后保留)线程相对昂贵,而ThreadPool
是为短期运行任务而设计的。因此,如果它在很短的时间内收到大量任务,那么批处理它们是有意义的,只有当它发现仍有任务等待一段时间后才开始新的线程。
您可以使用ThreadPool.SetMinThreads
强制它保持最少数量的线程。对于真正的系统,您通常不需要这样做,但它对于演示或类似的东西是有意义的。
答案 1 :(得分:1)
第一次产生许多并行执行此任务的线程。第二次使用线程池,它具有有限数量的线程。正如Jon所说,您可以使用属性来定义最小线程数。
但是,为什么你需要从并行线程进行异步调用?
这根本不会提高你的性能,因为你的工作已经并行完成了正在进行另一次拆分(使用线程池),这会因线程上下文切换而引入更多延迟。没有必要这样做。