线程数组,一次只有几个活动线程

本文关键字:线程 一次 有几个 活动 数组 | 更新日期: 2023-09-27 18:36:27

如果这是简单的问题,我很抱歉,但我非常疲惫,虽然想得很直。 我最近设置了线程,它工作得很好。 用户选择要对其执行工作的项目,我动态地为他们选择的项目数创建一个Thread数组,并为每个项目调度一个线程。

但是,我注意到如果选择了太多,则文件所在的服务器不能很好地播放。 我知道一个事实,即使有 30 个项目需要工作,我一次只能声明 5 个活动线程,但我无法绕过它。

PS:如果我描述线程池让我知道...我试图让它工作,但花了很长时间,没有运气,对 .NET 线程方式来说很陌生。

当前方式:

threadedResults = new List<string>[SelectedItems.Count];
List<string> results = new List<string>();
ThreadSettings tsArgs = (ThreadSettings)args;
for (int i = 0; i < SelectedItems.Count; i++)
{
    threadedResults[i] = new List<string>();
}
Thread[] threads = new Thread[SelectedItems.Count];
for (int i = 0; i < SelectedItems.Count; i++)
{
    KeyValuePair<int, ThreadSettings> threadArgs = new KeyValuePair<int, ThreadSettings>(i, (ThreadSettings)tsArgs);
    threads[i] = new Thread(new ParameterizedThreadStart(DoWork));
    threads[i].Start(threadArgs);
}
for (int i = 0; i < SelectedItems.Count; i++)
{
    if (CommandTask != null)
        threads[i].Join();
    else
    {
        // User Cancelled, abort all threads and break
        for (int j = 0; j < SelectedItems.Count; j++)
        {
            threads[j].Abort();
        }
        break;
    }
}
// Gather all results, format and return

线程数组,一次只有几个活动线程

基本上,你想在TPL中做这样的事情:

        // source for cancelling work
        var cxlSource = new CancellationTokenSource();
        // create and schedule tasks to start
        var tasks =
            Enumerable.Range(0, SelectedItems.Count)
                .Select(i => Task.Factory.StartNew(DoWork, yourStateInfo, cxlSource.Token))
                .ToArray();
        // then wait for the results
        Task.WaitAll(tasks);

如果您在任何时候需要取消任务,可以请求取消:

            cxlSource.Cancel();

这将防止任何等待执行的任务启动,并且您的任务可以定期检查令牌本身,以便在进行中取消时可以提前中止。

使用 TPL(以及一般的线程)有很多细微差别,但这是一个粗略的想法。

如果你想

坚持你的版本,我会声明Environment.ProcessorCount线程数,而不是5(如果你有2个处理器,5个线程中只有2个将同时运行)。线程过多会导致系统中的开销(这可能是您的问题所在)。

如果没有,请考虑使用 .net 4 中的任务或 TreadPool。