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

时间:2012-06-06 15:47:31

标签: c# winforms multithreading .net-4.0 threadpool

道歉,如果这是一个简单的问题,但我非常疲惫,虽然直接思考。我最近设置了线程并且工作得很好。用户选择要执行工作的项目,并动态创建一个Thread数组,无论他们选择多少项,并为每个项目分配一个线程。

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

PS:如果我正在描述ThreadPool让我知道......我试图让它工作,但有一段时间没有运气,这是.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

2 个答案:

答案 0 :(得分:2)

基本上,你想在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(以及一般的线程)有很多细微差别,但这是一个粗略的想法。

答案 1 :(得分:1)

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

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