C# 无法并行进行异步调用(多线程)
首先,我有一个线程等待示例,它工作得非常完美。它的任务是让100个线程等待3秒钟,然后进行输出: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 };
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");
}