>  기사  >  백엔드 개발  >  C# 비동기 대기

C# 비동기 대기

WBOY
WBOY원래의
2024-09-03 15:31:46676검색

C#에서는 비동기 프로그래밍에 async 및 Wait 키워드가 사용됩니다. 애플리케이션에서 실행되는 긴 메소드와 같은 일부 프로세스로 인해 애플리케이션에서 UI가 차단되는 경우가 있습니다. 이 프로세스가 끝나면 UI가 반응하게 됩니다.

백그라운드에서 실행 중인 모든 프로세스에 관계없이 애플리케이션이 반응하도록 하려면 async 및 wait 키워드를 사용하여 코드를 비동기화하여 결과적으로 애플리케이션이 이미 실행 중일 때 다른 코드 실행을 시작할 수 있도록 할 수 있습니다. 다른 코드와 독립적인 긴 메소드가 실행 중입니다.

구문:

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

위 명령문에서 async 및 wait 키워드는 이 코드가 비동기 코드임을 지정합니다. 'MethodName' 메서드는 비동기적으로 실행되며 애플리케이션을 차단하지 않고 Task.Run() 내부의 코드를 실행합니다.

C#에서 Await와 Async는 어떻게 작동하나요?

순차 및 동기 프로그래밍에서는 코드가 더 이상 실행되지 않습니다. 즉, 현재 문이 작업을 완료할 때까지 다음 문이 실행되지 않습니다. 이러한 유형의 실행은 긴 계산에 더 많은 시간이 걸리고 때로는 애플리케이션이 응답하지 않게 만들 수 있습니다. 이러한 상황을 극복하기 위해 async 및 wait 키워드를 사용하여 코드를 비동기식으로 만들 수 있습니다.

예를 들어 코드에 두 개의 메소드가 있고 이 메소드는 서로 독립적인 경우입니다. 첫 번째 방법은 긴 계산을 수행하는 것이고 두 번째 방법은 응용 프로그램의 일부 세부 정보를 인쇄하는 것입니다. 첫 번째 방법은 두 번째 방법보다 실행하는 데 더 많은 시간이 필요합니다. 코드가 동기식이면 첫 번째 메서드가 실행을 완료할 때까지 두 번째 메서드가 실행되지 않습니다.

반면에 첫 번째 메서드에서 async 및 wait 키워드를 사용하여 비동기화한 경우 두 번째 메서드는 첫 번째 메서드 완료에 관계없이 실행을 시작할 수 있습니다. 이 비동기 프로그래밍은 실행하는 데 시간이 덜 걸리므로 애플리케이션의 응답성이 향상되고 본질적으로 사용자 친화적이게 됩니다.

await 키워드를 사용하는 모든 메소드는 비동기로 표시되어야 합니다. async 키워드는 이 메서드가 비동기 메서드임을 컴파일러에 알리는 메서드 시그니처에 사용됩니다. 오버로드된 메서드에 비동기를 적용할 수도 있습니다. async 및 Wait를 사용하여 비동기 코드를 작성한다고 해서 작업이 여러 스레드에 의해 수행되는 것은 아니지만 애플리케이션의 기본 스레드가 차단되지 않는다는 것을 보장합니다. wait 없이는 async를 사용할 수 없으며 비동기 없이는 wait를 사용할 수 없습니다. 이러한 키워드를 사용하여 IO 바인딩 및 CPU 바인딩 작업을 모두 수행하는 비동기 코드를 작성할 수 있습니다.

비동기 메서드에서 Wait 연산자는 피연산자가 해당 비동기 작업 실행을 완료할 때까지 해당 메서드의 처리를 중단합니다. 비동기 작업이 완료된 후 Wait 연산자는 이 비동기 작업의 결과를 반환합니다. 반면, Wait 연산자의 피연산자가 이미 해당 작업을 완료한 경우 Wait 연산자는 해당 비동기 메서드의 처리를 일시 중단하지 않고 비동기 메서드를 일시 중단하지 않고 즉시 작업 결과를 반환합니다. Wait 연산자에 의해 비동기 메서드가 일시 중단되면 해당 비동기 메서드의 제어가 호출자 메서드로 다시 반환됩니다.

비동기 및 대기 키워드로 작업하는 동안 명심해야 할 몇 가지 사항을 아래에서 찾아보세요.

  • 메서드가 비동기로 표시되면 이 메서드 내에서 wait 연산자를 사용해야 합니다. 그렇지 않으면 사용자는 컴파일러로부터 경고를 받고 해당 메서드는 다른 일반 메서드처럼 실행됩니다.
  • 'async void'는 이벤트 핸들러에만 사용해야 하며 이벤트에는 반환 유형이 없으므로 메서드에는 사용하지 않아야 합니다.
  • 'async void'로 표시된 메소드에서 발생하는 예외는 메소드 외부에서 catch할 수 없으며 이러한 메소드를 테스트하는 것도 매우 어렵습니다.

C# 비동기 대기의 예

아래 예시는 다음과 같습니다.

예시 #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

아래에서 비동기의 또 다른 예를 찾아 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 및 Wait 키워드는 비동기 코드를 작성하는 데 사용됩니다. 메소드가 긴 계산을 수행하거나 실행하는 데 더 많은 시간이 필요한 작업이 있는 경우 애플리케이션이 응답할 수 있도록 이러한 작업을 비동기식으로 수행할 수 있습니다.

위 내용은 C# 비동기 대기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
이전 기사:C# 작업 대리자다음 기사:C# 작업 대리자