首页  >  文章  >  后端开发  >  C# 等待异步

C# 等待异步

WBOY
WBOY原创
2024-09-03 15:31:46697浏览

在C#中,async和await关键字用于异步编程。有时在我们的应用程序中,UI 会因为某些进程(例如应用程序中运行的长方法)而被阻塞。当此过程结束时,UI 将变得响应。

如果我们希望我们的应用程序无论后台运行的任何进程都能够响应,那么我们可以使用 async 和 wait 关键字,这将使我们的代码异步,从而允许我们的应用程序在已经执行其他代码时开始执行其他代码长方法正在执行,它独立于其他代码。

语法:

public asyncTask<em>MethodName</em>()
{
await Task.Run(
//user code
);
}

上面的语句中,async和await关键字指定该代码是异步代码。 “MethodName”方法将异步执行,它将执行 Task.Run() 内的代码,而不会阻塞应用程序。

Await 和 Async 在 C# 中如何工作?

在顺序和同步编程中,代码将不会进一步执行,即除非当前语句完成工作,否则不会执行下一条语句。这种类型的执行需要更多的时间来进行长时间的计算,并且有时会使我们的应用程序无响应。为了克服这种情况,我们可以借助 async 和 wait 关键字使代码异步。

例如,如果我们的代码中有两个方法,并且这些方法是相互独立的。第一种方法是进行长时间计算,第二种方法是打印应用程序的一些详细信息。第一种方法比第二种方法需要更多的执行时间。如果我们的代码是同步的,那么除非第一个方法完成执行,否则第二个方法将不会执行。

另一方面,如果我们在第一个方法中使用了 async 和await 关键字来使其异步,那么无论第一个方法是否完成,第二个方法都可以开始执行。这种异步编程需要更少的执行时间,从而使我们的应用程序更具响应性和用户友好性。

任何使用await关键字的方法都必须标记为异步。 async 关键字用在方法签名中,告诉编译器该方法是异步方法。我们还可以将 async 应用于重载方法。使用async和await编写异步代码并不意味着我们的任务将由多个线程执行,但它可以确保应用程序的主线程不会被阻塞。我们不能在没有await 的情况下使用async,也不能在没有async 的情况下使用await。我们可以使用这些关键字编写异步代码来执行 IO 密集型和 CPU 密集型操作。

在异步方法中,await 运算符会挂起该方法的处理,直到其操作数完成执行相应的异步操作。异步操作完成后,await 运算符返回本次异步操作的结果。另一方面,如果await运算符的操作数已经完成其操作,则await运算符不会暂停相应异步方法的处理,并立即返回操作结果,而不暂停异步方法。通过等待运算符暂停异步方法时,该异步方法的控制权将返回到调用者方法。

使用 async 和 wait 关键字时请记住以下几点:

  • 如果一个方法被标记为异步,那么该方法中应该使用await 运算符,否则用户将从编译器收到警告,并且该方法将像任何其他正常方法一样执行。
  • “async void”只能用于事件处理程序,而不应用于方法,因为事件没有任何返回类型。
  • 标记为“async void”的方法抛出的异常无法在方法外捕获,而且测试这样的方法非常困难。

C# Await Async 示例

以下是示例:

示例#1

代码:

using System;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApp4
{
public class Program
{
public static void Main()
{
TaskMethod();
Console.ReadLine();
}
public static async void TaskMethod()
{
Task<int> task = new Task<int>(CountCharacters);
task.Start();
Console.WriteLine("1. Other task executing");
Console.WriteLine("2. Other task executing");
Console.WriteLine("3. Other task executing");
int count = await task;
Console.WriteLine(" Total characters in file: " + count);
Console.WriteLine("1. After executing task");
Console.WriteLine("2. After executing task");
}
//method to count number of characters in file
public static intCountCharacters()
{
int count = 0;
string filePath = @"E:\Content\content.txt";
Console.WriteLine("Reading file");
using (StreamReaderstreamReader = new StreamReader(filePath))
{
//reading the whole content of the file
string fileContent = streamReader.ReadToEnd();
count = fileContent.Length;
}
Console.WriteLine("File reading completed");
return count;
}
}
}

输出:

C# 等待异步

在输出中我们可以看到上面的程序是异步执行的。文件读取过程开始,在读取文件的过程中,不等待文件读取完毕,就开始执行读取文件过程之后的语句。

示例#2

请在下面找到另一个使用 async 和 wait 计算数字总和直到 1000 的示例。

代码:

using System;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApp4
{
public class Program
{
public static void Main()
{
TaskMethod();
Console.ReadLine();
}
public static async void TaskMethod()
{
Task<int> task = new Task<int>(AddNumbers);
task.Start();
Console.WriteLine("1. Other task executing");
Console.WriteLine("2. Other task executing");
Console.WriteLine("3. Other task executing");
int total = await task;
Console.WriteLine(" Sum of numbers till 1000: " + total);
Console.WriteLine("1. After executing task");
Console.WriteLine("2. After executing task");
}
//method to add numbers from 1 to 1000
public static intAddNumbers()
{
int count = 0;
Console.WriteLine("Adding numbers");
for (inti = 0; i<= 1000; i++)
{
count += i;
}
return count;
}
}
}

输出:

C# 等待异步

结论

C#中的async和await关键字用于编写异步代码。如果一个方法正在执行长时间计算,或者有一个操作需要更多时间来执行,那么我们可以异步执行这些操作,因此我们的应用程序将做出响应。

以上是C# 等待异步的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
上一篇:C# Action Delegate下一篇:C# Asynchronous