繁体   English   中英

任务可用的最大线程数

[英]Maximum number of Threads available to Tasks

我正在努力让我了解C#中的async-await功能。 我编写了以下代码以异步运行多个任务-当前,它们所要做的只是在一定时间后引发一个事件。

public class Program
{
    public static Stopwatch Watch = new Stopwatch();

    public static void Main(string[] args)
    {
        AsyncClass asyncClass = new AsyncClass();
        asyncClass.WaitSecondsAsyncCompleted += asyncClass_WaitSecondsAsyncCompleted;
        List<Task> tasks = new List<Task>();
        Watch.Start();
        for (int i = 1; i < 6; i++)
        {
            tasks.Add(asyncClass.WaitSecondsAsync(i, Watch));
        }
        Task.WaitAll(tasks.ToArray());
        Console.ReadLine();
    }

    private static void asyncClass_WaitSecondsAsyncCompleted(int i)
    {
        Console.WriteLine("{1} : Async Method Called: waited for {0} seconds", i, Watch.ElapsedMilliseconds);
    }
}

public class AsyncClass
{
    public event Action<int> WaitSecondsAsyncCompleted;

    public async Task WaitSecondsAsync(int x, Stopwatch watch)
    {
        await Task.Run(() =>
        {   
            Thread.Sleep(x * 500); 
        });

        if (WaitSecondsAsyncCompleted != null)
        {
            WaitSecondsAsyncCompleted(x);
        }
    }
}

我希望任务大约每半秒钟完成一次-但这并不是我所看到的。 相反,前四个任务会按时完成,但最后一个任务要多半秒的延迟: 以上代码的输出

这似乎很奇怪-我唯一能想到的是,一个任务可用的线程数有一个限制,而且这个限制非常小,因此第五个任务必须等待第一个任务任务必须先完成才能开始。

我添加了一些额外的输出,并增加了尝试获取更多信息的任务数量,但我对此几乎没有任何意义-输出似乎是确定性的,重用了一些线程,但也使用了新的线程。 完成任务的延迟似乎也继续增加(例如,对于任务10,我希望它在5秒后完成,而在8秒后停止)。 我已经附上了下面的输出。

我想知道的是:

  • 有人知道这个特定示例中发生了什么吗?
  • 可用的线程限制是否足够小以在此处产生作用?
  • 我认为异步任务不能保证立即启动,但是似乎还有其他确定性过程正在执行,这是我所料不到的。 有人知道那是什么吗?

输出带有额外的调试信息


编辑

请注意,此问题不是在询问可以运行的最大任务数(TPL中的Max任务? ),而是在运行多达5个任务时如何看到效果。 我的印象是,默认的threadPool包含的线程更多。

因此,事实证明,我所看到的问题与线程池大小有关。 显然,这最初设置为计算机的内核数( https://msdn.microsoft.com/en-us/library/system.threading.threadpool.getminthreads%28v=vs.110%29.aspx )。

它可以增加,并且这样做意味着更多的任务最初同时运行( https://msdn.microsoft.com/en-us/library/system.threading.threadpool.setminthreads%28v=vs.110%29 .aspx

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM