Dav*_*ave 0 c# asynchronous async-await
这是我试图模拟的代码。我可以删除 async-await 来执行“即发即忘”,但我试图理解异步(非阻塞)代码的目的,但看起来 AWAIT 是运行该方法之前的阻塞代码NextProcess()。如果我删除等待,它就满足了我的目标,但是在后台运行完成后有没有办法获得任何类型的异常或状态?
public static async Task Main()
{
Console.WriteLine("Starting the long-running process...");
await Task.Run(() => LongRunningProcess());
NextProcess();
}
private static void LongRunningProcess()
{
// Simulating the work being done
for (int i = 0; i < 5; i++)
{
Console.WriteLine(i);
Thread.Sleep(1000);
}
}
private static void NextProcess()
{
Console.WriteLine("In See method, continuation without waiting!");
}
Run Code Online (Sandbox Code Playgroud)
我尝试了粘贴代码的各种排列。
看起来 AWAIT 是运行 NextProcess() 方法之前的阻塞代码。
您可以将“等待”视为“异步等待”。它确实会暂停该方法(即,它等待),但不会阻塞线程(即,它是异步的,而不是同步的)。您可能会发现我的async介绍很有帮助。
如果我删除等待,它就满足了我的目标,但是在后台运行完成后有没有办法获得任何类型的异常或状态?
当然; Task方法的返回值表示async该方法的执行。当该方法完成时, 也Task完成,如果该方法抛出异常,则 也Task随着该异常而完成。在本例中,您使用Task.Run在线程池线程上执行同步代码,但同样的想法也适用:返回的Task代表传递给的委托的执行Task.Run。
实例并没有什么神奇之处Task。您可以将Task实例存储在变量或其他变量中,并稍后观察它:
public static async Task Main()
{
Console.WriteLine("Starting the long-running process...");
var task = Task.Run(() => LongRunningProcess());
NextProcess();
await task;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
89 次 |
| 最近记录: |