异步和等待不起作用
本文关键字:不起作用 等待 异步 | 更新日期: 2023-09-27 18:35:08
我正在尝试学习.NET 4.5的异步和等待功能。首先这是我的代码
static async void Method()
{
await Task.Run(new Action(DoSomeProcess));
Console.WriteLine("All Methods have been executed");
}
static void DoSomeProcess()
{
System.Threading.Thread.Sleep(3000);
}
static void Main(string[] args)
{
Method();
//Console.WriteLine("Method Started");
Console.ReadKey();
}
这段代码在控制台上没有给我任何结果。我不明白为什么。我的意思是,任务不是应该只是没有阻塞的线程吗?但是,如果我在主方法中取消注释 Console.WriteLine() 一切似乎都工作正常。
谁能告诉我这里发生了什么?
对于异步/等待模式,有些事情与以前的线程不同。
-
你不应该使用
System.Threading.Thread.Sleep
因为这仍然是阻塞的,不适用于异步。而是使用Task.Delay
-
考虑使所有代码异步。只有控制台中的 Main 方法不能异步原因
-
避免
async void
方法。基本上,异步 void 仅适用于无法返回某些内容的事件处理程序。所有其他异步方法应返回Task
或Task<T>
修改了您的示例:
static async Task Method()
{
await DoSomeProcess();
Console.WriteLine("All Methods have been executed");
}
static async Task DoSomeProcess()
{
await Task.Delay(3000);
}
现在更改您的 Main 方法,因为这应该是您开始任务的地方
Task.Run(() => Method()).Wait();
//Console.WriteLine("Method Started");
Console.ReadKey();
学习如何正确使用async
和await
关键字有一个很小的学习曲线。
问题是没有人在等待谁在等待,还有其他一些细节,例如SyncronizationContext
和Task
:
您应该查看一些文章:http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx
要在控制台中使用 async 和 await 关键字,您需要一个额外的代码:无法在控制台应用的"Main"方法上指定"异步"修饰符,或者等待单元测试的异步 void 方法调用或单元测试资源管理器未显示 Metro 应用的异步单元测试
我通常这样做:
static void Main(string[] args)
{
Console.WriteLine("HELLO WORLD");
var t1 = Task.Factory.StartNew(new Func<Task>(async () => await Method()))
.Unwrap();
Console.WriteLine("STARTED");
t1.Wait();
Console.WriteLine("COMPLETED");
Console.ReadKey();
}
static async Task Method()
{
// this method is perfectly safe to use async / await keywords
Console.WriteLine("BEFORE DELAY");
await Task.Delay(1000);
Console.WriteLine("AFTER DELAY");
}