[英]Understanding the C# “async/await” pattern by Java developer
我来自 Java 开发环境,并已开始使用 C# 进行编码。 我注意到 C# 中的“async/await”模式,我在 Java 中从未见过。 究竟是什么? 我已经浏览了一段时间的互联网,但找不到明确的解释来阐明我对它是什么的理解。
因此,让我们定义以下场景:
首先,这两种语法都是不同的。
线程语法:-
Thread thread = new Thread(() => VoidMethod("","",""));
thread.Start();
https://www.c-sharpcorner.com/blogs/asynchronous-multithreaded-programming-with-example-in-c-sharp
如果您使用此线程不返回任何值。 当整个请求完成时。
任务/任务<> 语法:-
public async Task<int> VoidMethod("","","")
{
await Task.Run(() => VoidMethod("","",""));
return 1;
}
https://www.c-sharpcorner.com/article/async-and-await-in-c-sharp/
如果您使用此方法返回值。 当整个请求完成时。
await()
可能会导致从 async 方法返回,但它的执行未完成,稍后会再次调用。 为了稍后被调用,它在返回之前进入某个事件的队列,就像在Java中线程可以调用Object.wait()
,这意味着线程进入某个事件的队列并离开处理器。 异步方法离开线程,因为线程为它扮演处理器的角色。
当事件发生时,异步方法被恢复,也就是说,它只是在线程池的下一个可用线程上再次调用 - 就像 wait() 之后的线程在下一个可用处理器上运行一样。 为了不是从头继续执行,而是从它因为await()
返回的最后一个地方继续执行,关于状态的信息被保存,然后以以下形式使用: switch(state) { case 0: goto 0'; case 1: goto 10'; .... }
switch(state) { case 0: goto 0'; case 1: goto 10'; .... }
请注意,这是字节码,因此可以使用goto
。 为了保存状态,我们需要一个对象的字段,所以 async 方法实际上不是一个方法而是一个类,它在第一次被调用的地方被实例化。
由于直接使用goto
,很难或有时不可能用纯 C# 或 Java 编写异步方法。 但是始终可以将异步方法的每个部分编码为一个单独的方法,并将该方法用作等待事件的回调。 Async/await 只是异步编程的另一种语法,还有回调、actor、ComplatableFuture、java.util.concurrent.Flow 等。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.