C#中的控制台应用程序异步?
我有一个简单的代码:C#中的控制台应用程序异步?,c#,.net-4.5,async-await,c#-5.0,C#,.net 4.5,Async Await,C# 5.0,我有一个简单的代码: public static async Task<int> SumTwoOperationsAsync() { var firstTask = GetOperationOneAsync(); var secondTask = GetOperationTwoAsync(); return await firstTask + await secondTask; } private async Task<int> GetOper
public static async Task<int> SumTwoOperationsAsync()
{
var firstTask = GetOperationOneAsync();
var secondTask = GetOperationTwoAsync();
return await firstTask + await secondTask;
}
private async Task<int> GetOperationOneAsync()
{
await Task.Delay(500); // Just to simulate an operation taking time
return 10;
}
private async Task<int> GetOperationTwoAsync()
{
await Task.Delay(100); // Just to simulate an operation taking time
return 5;
}
但我已经读到(当使用sync
)时,我必须一直同步向上和向下
问题:这是否意味着我的Main
函数应该标记为async
不可能是因为有一个编译错误:
无法使用“async”修饰符标记入口点
如果我理解了异步的内容,线程将进入Main
函数-->sumtwooperationasync
-->将调用这两个函数并退出。但是直到sumtwoperationasync
static void Main(string[] args)
{
SumTwoOperationsAsync();
}
我缺少什么?在大多数项目类型中,您的
async
“向上”和“向下”将以async void
事件处理程序结束,或者将任务返回到框架中
但是,控制台应用程序不支持此功能
您可以对返回的任务执行等待
:
static void Main()
{
MainAsync().Wait();
// or, if you want to avoid exceptions being wrapped into AggregateException:
// MainAsync().GetAwaiter().GetResult();
}
static async Task MainAsync()
{
...
}
或者你可以:
有关async
控制台应用程序的详细信息如下。在大多数项目类型中,您的async
的“向上”和“向下”将以async void
事件处理程序结束,或将任务返回到您的框架中
但是,控制台应用程序不支持此功能
您可以对返回的任务执行等待
:
static void Main()
{
MainAsync().Wait();
// or, if you want to avoid exceptions being wrapped into AggregateException:
// MainAsync().GetAwaiter().GetResult();
}
static async Task MainAsync()
{
...
}
或者你可以:
有关async
控制台应用程序的更多信息,请参阅。以下是最简单的方法
static void Main(string[] args)
{
Task t = MainAsync(args);
t.Wait();
}
static async Task MainAsync(string[] args)
{
await ...
}
下面是最简单的方法
static void Main(string[] args)
{
Task t = MainAsync(args);
t.Wait();
}
static async Task MainAsync(string[] args)
{
await ...
}
作为一种快速且范围非常广泛的解决方案:
当与I/O一起使用时,Task.Result和Task.Wait都不允许提高可伸缩性,因为它们会导致调用线程在等待I/O结束时一直处于阻塞状态
在未完成的任务上调用.Result时,执行该方法的线程必须坐在那里等待任务完成,这会阻止线程同时执行任何其他有用的工作。这否定了任务异步性质的好处
作为一种快速且范围非常广泛的解决方案:
当与I/O一起使用时,Task.Result和Task.Wait都不允许提高可伸缩性,因为它们会导致调用线程在等待I/O结束时一直处于阻塞状态
在未完成的任务上调用.Result时,执行该方法的线程必须坐在那里等待任务完成,这会阻止线程同时执行任何其他有用的工作。这否定了任务异步性质的好处
我的解决方案。JSONServer是我为在控制台窗口中运行HttpListener服务器而编写的类
class Program
{
public static JSONServer srv = null;
static void Main(string[] args)
{
Console.WriteLine("NLPS Core Server");
srv = new JSONServer(100);
srv.Start();
InputLoopProcessor();
while(srv.IsRunning)
{
Thread.Sleep(250);
}
}
private static async Task InputLoopProcessor()
{
string line = "";
Console.WriteLine("Core NLPS Server: Started on port 8080. " + DateTime.Now);
while(line != "quit")
{
Console.Write(": ");
line = Console.ReadLine().ToLower();
Console.WriteLine(line);
if(line == "?" || line == "help")
{
Console.WriteLine("Core NLPS Server Help");
Console.WriteLine(" ? or help: Show this help.");
Console.WriteLine(" quit: Stop the server.");
}
}
srv.Stop();
Console.WriteLine("Core Processor done at " + DateTime.Now);
}
}
我的解决方案。JSONServer是我为在控制台窗口中运行HttpListener服务器而编写的类
class Program
{
public static JSONServer srv = null;
static void Main(string[] args)
{
Console.WriteLine("NLPS Core Server");
srv = new JSONServer(100);
srv.Start();
InputLoopProcessor();
while(srv.IsRunning)
{
Thread.Sleep(250);
}
}
private static async Task InputLoopProcessor()
{
string line = "";
Console.WriteLine("Core NLPS Server: Started on port 8080. " + DateTime.Now);
while(line != "quit")
{
Console.Write(": ");
line = Console.ReadLine().ToLower();
Console.WriteLine(line);
if(line == "?" || line == "help")
{
Console.WriteLine("Core NLPS Server Help");
Console.WriteLine(" ? or help: Show this help.");
Console.WriteLine(" quit: Stop the server.");
}
}
srv.Stop();
Console.WriteLine("Core Processor done at " + DateTime.Now);
}
}
如果不是控制台应用,我的观察(最后一行问题)正确吗?线程停止在sumtwooperationasync
…对吗?(假设主调用方法没有标记为async)我有一个解释线程如何通过“上下文”处理async
。重新阅读你的答案-你是说在控制台应用程序中使用async没有意义吗?@RoyiNamir:没有。不过,这并不常见,除非你使用的是仅异步的API。控制台(和其他桌面)应用程序通常不太关心浪费线程。@user2173353:不,它肯定会被捕获在捕获中。如果这不是你看到的,我建议你用最少的代码示例问自己的问题。如果不是控制台应用,我的观察(问题的最后一行)正确吗?线程停止在sumtwooperationasync
…对吗?(假设主调用方法没有标记为async)我有一个解释线程如何通过“上下文”处理async
。重新阅读你的答案-你是说在控制台应用程序中使用async没有意义吗?@RoyiNamir:没有。不过,这并不常见,除非你使用的是仅异步的API。控制台(和其他桌面)应用程序通常不太关心浪费线程。@user2173353:不,它肯定会被捕获在捕获中。如果你看到的不是这个,我建议你用一个简单的代码示例问自己的问题。这里有一个@nawful似乎遗漏了关键的链接,所以这里是…-在您的visual studio 2017项目中,转到项目属性->构建->高级,然后将您的语言版本更改为7.1(或更高版本)。这里有一个@nawful似乎遗漏了关键链接,因此它就是…-在visual studio 2017项目中,转到项目属性->构建->高级,然后将语言版本更改为7.1(或更高版本)