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

本文关键字:方法 最佳 方式 新线程 线程 | 更新日期: 2023-09-27 18:05:12

我有对象数组,我需要它们在一个单独的线程中执行。我认为最好使用异步调用开始/结束。调用,但即使它在一个新线程上执行,它也在等待一个线程的回调返回。但是我需要同时在不同的线程中触发所有的对象。

但是我的另一个问题是,如果我为每个对象创建一个线程,它将是昂贵的。请告诉我完成这项任务的最佳方法。

下面是我尝试过的assync方法,

object[10] objs = new objects[];
foreach (object o in objs)
{
    // method needs to process ASAP
    StartProcessing(o);
}
void StartProcessing(object o)
{
}

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

由于在问题中没有任何特殊要求来触发方法,我看不出QueueUserWorkItem不适合的任何原因:

foreach(object o in objs)
{
    // start processing is a return void method needs to process ASAP
    var v = o;
    ThreadPool.QueueUserWorkItem(_ => StartProcessing(v));
}

您可以使用任务来实现。

    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
    }

可以使用Parallel。对于数组中的每个元素,它将启动Task,并在所有Task完成时同步返回。

Parallel.ForEach(objs, StartProcessing);