繁体   English   中英

Java 开发人员了解 C#“async/await”模式

[英]Understanding the C# “async/await” pattern by Java developer

我来自 Java 开发环境,并已开始使用 C# 进行编码。 我注意到 C# 中的“async/await”模式,我在 Java 中从未见过。 究竟是什么? 我已经浏览了一段时间的互联网,但找不到明确的解释来阐明我对它是什么的理解。

因此,让我们定义以下场景:

  1. 线程“T”(例如 GUI 线程)正在执行 GUI 异步函数“F”
  2. 在异步函数 'F' 的某个时刻,我们在“awaitable”对象 'A'(很可能是 Task/Task<>)上调用了 'await'。
  3. 然后,'await' 调用将释放/放弃(但不挂起)线程 'T'(在本例中为 GUI 线程)的执行,以便在 'awaitable' 时运行/执行其他一些任务A' 正在执行其工作。
  4. 当“awaitable”“A”对象完成其工作时,异步函数“F”的执行将恢复。 在上面的场景中(如果我描述正确的话),哪个线程将执行 'awaitable' 'A' 方法? – GUI 线程或池中的其他线程?。 如果它是一个池线程(不是 GUI 线程)并且我正在使用该方法访问 GUI 资源(例如按钮、标签、网格视图等),我会破坏 GUI 线程数据吗? 请记住,我来自 Java 世界,那里只有一个 GUI 线程可以更改/操作 GUI 资源。

首先,这两种语法都是不同的。

线程语法:-

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/

如果您使用此方法返回值。 当整个请求完成时。

最好的起点是文档:

使用 async 和 await 进行异步编程

比起Stephen ToubStephen Cleary 的任何博客文章。

  1. await()可能会导致从 async 方法返回,但它的执行未完成,稍后会再次调用。 为了稍后被调用,它在返回之前进入某个事件的队列,就像在Java中线程可以调用Object.wait() ,这意味着线程进入某个事件的队列并离开处理器。 异步方法离开线程,因为线程为它扮演处理器的角色。

  2. 当事件发生时,异步方法被恢复,也就是说,它只是在线程池的下一个可用线程上再次调用 - 就像 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM