找不到并行进行异步调用的方法(多线程)

时间:2011-06-17 06:31:50

标签: c# multithreading asynchronous

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

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

第一次产生许多并行执行此任务的线程。第二次使用线程池,它具有有限数量的线程。正如Jon所说,您可以使用属性来定义最小线程数。

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