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

本文关键字:异步 调用 方法 并行 多线程 找不到 | 更新日期: 2023-09-27 17:59:38

首先我有一个线程等待示例,它非常完美。它的工作是让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秒钟,并在几乎相同的时间内给出输出消息。

但是当我尝试使用异步回调来执行Console.WriteLine:时

    public void DoWaitCall()
    {
        MyDel del = () => { Thread.Sleep(3000); };
        del.BeginInvoke(CallBack, del);
    }
    private void CallBack(IAsyncResult r)
    {
        Console.WriteLine("done");
    }

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

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

您看到的效果基本上是ThreadPool逐渐上升。其想法是创建(然后保留)线程的成本相对较高,并且ThreadPool是为短时间运行的任务设计的。因此,如果它在短时间内接收到一堆任务,那么批量处理它们是有意义的,只有在发现稍后还有任务等待时才启动新线程。

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

第一次派生出许多并行执行任务的线程。第二次使用线程池时,线程池的线程数量有限。正如Jon所指出的,您可以使用一个属性来定义最小线程数。

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