如何运行无线程(e.在c#控制台应用程序中并行
本文关键字:控制台 并行 应用程序 线程 何运行 运行 | 更新日期: 2023-09-27 18:02:20
几个星期以来一直试图完成,但做了大量的搜索和尝试大多数逻辑,它没有发生。
场景:我想运行一个程序,其中有一些任务(异步),让我们说128(可能更大),我想要的是每个任务使用一个新的线程从线程池
假设有500个任务,每个任务使用系统资源中的单个线程。全部并行运行,即完全不依赖于彼此。
提前感谢。
我非常感谢你们提供的帮助。
在控制台应用程序中,您不能直接使用异步方法,使用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() =>…)
但即使这样,主线程也不一定要在可等待函数中。在启动所有其他线程之后,它仍然可以自由地做任何它想做的事情。