Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法并行进行异步调用(多线程)_C#_Multithreading_Asynchronous - Fatal编程技术网

C# 无法并行进行异步调用(多线程)

C# 无法并行进行异步调用(多线程),c#,multithreading,asynchronous,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 };

首先,我有一个线程等待示例,它工作得非常完美。它的任务是让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();
}
在这种情况下,所有线程等待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
是为短时间运行的任务而设计的。因此,如果它在很短的时间内收到一堆任务,那么对它们进行批处理是有意义的,只有当它发现仍有任务在稍后等待时才启动新线程


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

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


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

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


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

Im使用async all,因为没有可用的等待版本。那么为什么我的wait(非异步)程序在没有设置线程池minThreads的情况下运行良好呢?@demaxSH因为您正在手动创建100个不使用线程池的线程。当您使用异步调用时,它是在线程池中完成的,该线程池具有有限的线程数(由
MaxPoolThread
定义)。因此,最初您有100个线程,然后您拆分为另一个N个线程,只需等待N个线程完成即可。我使用async all,因为没有可用的等待版本。那么为什么我的wait(非异步)程序在没有设置线程池minThreads的情况下运行良好呢?@demaxSH因为您正在手动创建100个不使用线程池的线程。当您使用异步调用时,它是在线程池中完成的,该线程池具有有限的线程数(由
MaxPoolThread
定义)。因此,最初您有100个线程,然后您拆分为另一个N个线程,只需等待N个线程完成即可。
    public void DoWaitCall()
    {
        MyDel del = () => { Thread.Sleep(3000); };
        del.BeginInvoke(CallBack, del);
    }

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