我有对象数组,我需要它们在一个单独的线程中执行。 我认为最好使用异步调用begin / end.invoke,但即使它在新线程上执行,它也在等待一个线程的回调返回。 但是我需要立刻在不同的线程上触发所有对象。
但另一个问题是,如果我为每个对象创建一个线程,那将会很昂贵。 请让我知道执行此任务的最佳方式。
以下是我尝试过的assync方法,
object[10] objs = new objects[];
foreach (object o in objs)
{
// method needs to process ASAP
StartProcessing(o);
}
void StartProcessing(object o)
{
}
答案 0 :(得分:2)
由于在问题中解雇方法没有任何特殊要求,我无法看到任何理由,为什么QueueUserWorkItem
不适合:
foreach(object o in objs)
{
// start processing is a return void method needs to process ASAP
var v = o;
ThreadPool.QueueUserWorkItem(_ => StartProcessing(v));
}
答案 1 :(得分:0)
您可以使用任务来实现这一目标。
object[] objs = new object[10];
List<Task> tasks = new List<Task>();
foreach (object o in objs)
{
// method needs to process ASAP
var localObj = o;
tasks.Add(Task.Factory.StartNew(() => StartProcessing(localObj)));
}
try
{
Task.WaitAll(tasks.ToArray());
}
catch (AggregateException ae)
{
// handle the exceptions
}
答案 2 :(得分:0)
你可以使用Parallel.ForEach,它将为数组中的每个元素启动Task,并在所有Task完成时同步返回。
Parallel.ForEach(objs, StartProcessing);