这个问题已经在这里有一个答案:
- 不能指定一个控制台应用程序的“主”方法“异步”修改 15个回答
我有这个简单的代码:
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;
}
大。 这个编译。
但可以说,我有一个控制台应用程序,我想运行上面的代码(调用SumTwoOperationsAsync()
static void Main(string[] args)
{
SumTwoOperationsAsync();
}
但我读过(当使用sync
),我不得不一路同步上下 :
问 :那么,这是否意味着我的Main
功能应该被标记为async
?
那么它不可能是因为有一个编译错误:
一个入口点不能被打上了“异步”修饰符
如果我没有理解异步的东西,该线程将进入Main
功能----> SumTwoOperationsAsync
---->将调用这两个函数,将缺阵。 但直到SumTwoOperationsAsync
我在想什么?
在大多数项目类型,你的async
“向上”和“向下”将在结束async void
的事件处理程序或返回Task
到你的框架。
然而,控制台应用程序不支持此功能。
您可以只是做一个Wait
对返回的任务:
static void Main()
{
MainAsync().Wait();
// or, if you want to avoid exceptions being wrapped into AggregateException:
// MainAsync().GetAwaiter().GetResult();
}
static async Task MainAsync()
{
...
}
或者您可以使用自己的背景像我写的 :
static void Main()
{
AsyncContext.Run(() => MainAsync());
}
static async Task MainAsync()
{
...
}
欲了解更多信息async
控制台应用程序是在我的博客 。
下面是做到这一点的最简单方法
static void Main(string[] args)
{
Task t = MainAsync(args);
t.Wait();
}
static async Task MainAsync(string[] args)
{
await ...
}
作为一个快速和非常作用域的解决方案:
Task.Result
用我用/ O,因为它们会导致调用线程阻塞保持等待I / O结束时,双方Task.Result和Task.Wait不会允许提高可扩展性。
当你打电话。结果在一个不完整的任务,执行该方法的线程有坐下来,等待任务完成,阻断从做任何其他有用的工作,在此期间该线程。 这否定了任务的异步性的好处。
notasync
我的解决办法。 该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);
}
}