C# 是否有简单的方法替换.Wait(),以便能够异步处理它

C# 是否有简单的方法替换.Wait(),以便能够异步处理它,c#,console-application,.net-4.5,C#,Console Application,.net 4.5,我有一个小的控制台应用程序,我有问题,让应用程序等待所有进程完成后再关闭。由于这是一个将按计划运行的东西,我不能简单地添加Console.ReadKey或类似的东西 调用第一个异步方法时,我必须添加.Wait()以阻止应用程序继续执行其余代码。我试图了解这是否是在控制台应用程序中可以接受的方法,或者是否有更好的方法(希望很简单)来确保应用程序在关闭前等待异步方法。此外,我希望能够减少应用程序消耗的资源量,我的理解是,.Wait()将占用该线程,而不是释放它,这将导致额外的资源使用 下面是我的逻辑

我有一个小的控制台应用程序,我有问题,让应用程序等待所有进程完成后再关闭。由于这是一个将按计划运行的东西,我不能简单地添加
Console.ReadKey
或类似的东西

调用第一个异步方法时,我必须添加
.Wait()以阻止应用程序继续执行其余代码。我试图了解这是否是在控制台应用程序中可以接受的方法,或者是否有更好的方法(希望很简单)来确保应用程序在关闭前等待异步方法。此外,我希望能够减少应用程序消耗的资源量,我的理解是,
.Wait()
将占用该线程,而不是释放它,这将导致额外的资源使用

下面是我的逻辑

private static List<string> taskList = new List<string>();
private static SemaphoreSlim mutex = new SemaphoreSlim(3);

private static void Main(string[] args)
{
    StartAllTasks().Wait(); // This LINE 
}

private static async Task StartAllTasks()
{
    await Task.WhenAll(taskList.Select(name => ProcessSingleTask(name)));
}

private async static Task ProcessSingleTask(string name)
{
    await mutex.WaitAsync();
    try
    {
        TaskManager singleTask = new TaskManager(name);
        await Task.Factory.StartNew(() => singleTask.ProcessTask());
    }
    finally
    {
        mutex.Release();
    }
}
private static List taskList=new List();
私有静态信号量LIM互斥=新信号量LIM(3);
私有静态void Main(字符串[]args)
{
StartAllTasks().Wait();//此行
}
专用静态异步任务StartAllTasks()
{
wait Task.WhenAll(taskList.Select(name=>ProcessSingleTask(name));
}
专用异步静态任务ProcessSingleTask(字符串名称)
{
wait mutex.WaitAsync();
尝试
{
TaskManager singleTask=新TaskManager(名称);
wait Task.Factory.StartNew(()=>singleTask.ProcessTask());
}
最后
{
mutex.Release();
}
}

您所做的看起来是正确的。您需要调用Wait()来阻止主线程,因为这会使程序保持活动状态。阻塞线程并不意味着占用太多资源

wait和await调用没有做任何损害CPU的事情,尽管它们确实会阻塞线程


线程也很轻,所以不要太担心

不,您拥有的是最佳方式(在这种情况下)。实际上,这是在
Main
方法中等待
任务的推荐方法。Main方法不能是
async
,因此您不能在Main中等待

其他常见的选项是等待
WaitHandle
直到有人说该关机了,这实际上与您拥有的相同。所以坚持下去


如果你说的是其他方法,那就不同了。但是对于
Main
来说,这是完全正确的。

等待
在控制台的
Main
中是可以接受的。它将“浪费”一个线程,但浪费一个线程通常不是什么大问题


如果它困扰您,您可以使用它来为
async
代码提供一个单线程上下文。它也不会在
聚合异常中包装异常。但是,这意味着您的
async
代码不会在线程池线程上执行-它将全部在单个控制台主线程上执行。

不同意。我们应该始终考虑资源的消耗,线程是有限的资源。在这里,我们必须以某种方式等待,但一般来说,我们应该小心不要为了同步等待某些结果而使用线程。例如,正因为如此,在ASP.NET中,在重载情况下,我们可以更快地使用线程池。仅仅使用线程并不等于坏。显示的代码没有使用大量线程等待,因此这是正确的方法,他不必担心。