如何运行无线程(e.在c#控制台应用程序中并行

本文关键字:控制台 并行 应用程序 线程 何运行 运行 | 更新日期: 2023-09-27 18:02:20

几个星期以来一直试图完成,但做了大量的搜索和尝试大多数逻辑,它没有发生。

场景:我想运行一个程序,其中有一些任务(异步),让我们说128(可能更大),我想要的是每个任务使用一个新的线程从线程池

假设有500个任务,每个任务使用系统资源中的单个线程。全部并行运行,即完全不依赖于彼此。

提前感谢。

我非常感谢你们提供的帮助。

如何运行无线程(e.在c#控制台应用程序中并行

在控制台应用程序中,您不能直接使用异步方法,使用AsyncContext,由https://www.nuget.org/packages/Nito.AsyncEx提供。

然后你可以创建任务并异步执行它们

class Program
{
    static void Main(string[] args)
    {
        //use AsyncContext, provided by the Nito.AsyncEx library
        AsyncContext.Run(() => MainAsync(args));
    }
    static async void MainAsync(string[] args)
    {
        var taskList = new List<Task>();
        for (int i = 0; i < 128; i++)
        {
            //add the new Task to the list and start to execute it
            taskList.add(DoStuffAsync());
        }
        //wait for all to finish
        await Task.WhenAll(taskList);
    }
    private static async Task DoStuffAsync()
    {
        //do async stuff, like download from webpage
    }
}

您似乎想要通过多个线程执行多个任务。Async-Await的意思是让一个线程做其他事情,而它必须等待,直到某事准备好。

对Eric Lippert的采访帮助我理解了为什么和什么时候应该使用async-await。

另一篇帮助我理解async-await的文章是Stephen Cleary写的

如果你要启动的线程在等待的时候没有什么有用的事情可做,你可以使用start them:

static class Program
{
    static void Main(string[] args)
    {
        List<Task> runningTasks = new List<Task>();
        IEnumerable<Action> thingsToDo = GetThingsToDo()
        foreach (Action thingToDo in thingsToDo)
        {
            Task startedTask = Task.Run( () => thingToDo);
            runningTasks.Add(startedTask);
        }
        // now that all tasks are started do something else
        // after a while wait until all tasks finished
        Task.WaitAll(runningTasks.ToArray());
    }
}

只有当一个线程正在执行你的一个动作可以做一些有意义的事情,而等待在动作中的东西,考虑使你的动作可等待,通过声明他们async和任务。运行(async() =>…)

但即使这样,主线程也不一定要在可等待函数中。在启动所有其他线程之后,它仍然可以自由地做任何它想做的事情。