在新线程中触发方法的最佳方法

时间:2014-05-24 19:11:35

标签: c# multithreading asynchronous .net-3.5 threadpool

我有对象数组,我需要它们在一个单独的线程中执行。 我认为最好使用异步调用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)
{
}

3 个答案:

答案 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);