2011-06-17 43 views
0

起初我有线程等待的例子,它的工作原理是完美的。它的任务是要求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(); 
} 

来电:: DoWaitCall()看起来像:

public void DoWaitCall() 
{ 
    Thread.Sleep(3000); 
    Console.WriteLine("done"); 
} 

在这种情况下,所有的线程等待3秒钟,并给输出消息几乎在同一时间。

但是,当我尝试使用异步回调做Console.WriteLine命令:

public void DoWaitCall() 
    { 
     MyDel del =() => { Thread.Sleep(3000); }; 
     del.BeginInvoke(CallBack, del); 
    } 

    private void CallBack(IAsyncResult r) 
    { 
     Console.WriteLine("done"); 
    } 

每个线程等待不同的时间,并使它们的输出一个接一个缓慢。 有没有什么好的方法可以并行实现异步回调?

回答

2

你看到的效果是ThreadPool逐渐增加,基本上。这个想法是创建(然后保持)线程相对昂贵,并且ThreadPool专为短期运行任务而设计。因此,如果它在很短的时间内收到一堆任务,那么对它们进行批处理是有意义的,只有在发现仍有任务稍后等待时才开始新线程。

你可以强制它使用ThreadPool.SetMinThreads来保持最少的线程数。对于real系统,您通常不需要这样做,但对于演示或类似的东西来说它是有意义的。

1

您第一次产生了许多并行执行作业的线程。第二次使用线程池的线程数量有限。正如乔恩指出的,你可以使用一个属性来定义最小线程数。

但是,为什么你需要从并行线程进行异步调用?
这完全不会改善您的性能,因为您的工作已经并行完成,并且您正在进行另一次拆分(使用线程池),由于线程上下文切换,这将引入更多的延迟。没有必要这样做。

+0

因为没有可用的等待版本,所以我使用异步。那么为什么我的等待(非异步)程序运行良好而不设置threadPool minThreads? – demaxSH 2011-06-17 06:54:35

+0

@demaxSH由于您手动创建100个线程,因此不使用该池。当你使用异步调用时,它在线程池中完成,线程池的线程数量有限(由MaxPoolThread定义)。所以最初你有100个线程,然后你分裂到另一个* N *线程,并等待直到* N *线程完成。 – oleksii 2011-06-17 07:03:06