道歉,如果这是一个简单的问题,但我非常疲惫,虽然直接思考。我最近设置了线程并且工作得很好。用户选择要执行工作的项目,并动态创建一个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
答案 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。