본문 바로가기
카테고리 없음

C#에서 비동기[Task] 메서드를 정의하는 여러 가지 방법 및 경우에 따라 사용 방법

by 오늘도 빛나는 너에게 2024. 9. 12.
728x90

private async  Task RunTasksAsync()

설명

async 키워드와 Task 반환 형식을 사용한 비동기 메서드

메서드 내부에서 await 키워드를 사용할 수 있으며, 비동기 작업을 처리할 수 있다.

사용 의도

비동기 작업을 수행하고 호출자에게 완료 여부를 알리고 싶을 때 사용.

호출자는 await 키워드를 사용하여 메서드가 완료될 때까지 대기할 수 있다.

예제코드

private async Task RunTasksAsync()
{
    await Task.Delay(1000); // 1초 대기
    Console.WriteLine("RunTasksAsync 완료");
}

 

기대 효과

 ✓ 비동기 작업을 수행하고, 호출자는 해당 작업이 완료될 때까지 비동기적으로 대기할 수 있습니다.

 ✓ 예외 처리를 쉽게 할 수 있습니다.

 ✓ 호출자가 await 키워드를 사용하여 메서드를 호출할 수 있습니다.

 ✓ 예외가 발생하면 await에 의해 호출자에게 전달됩니다.


private void   RunTasksAsync()

설명

 ✓ 반환 형식이 void인 동기 메서드입니다.

 ✓ 비동기 메서드가 아니다.

사용 의도

 ✓ 비동기 작업이 필요 없는 경우 사용.

 ✓ 메서드가 즉시 실행되고 완료됨.

예제코드

private void RunTasksAsync()
 {
  Console.WriteLine("RunTasksAsync 실행 중");
 }

 

기대효과

 ✓ 즉시 실행되고 완료

 ✓ 호출자는 메서드가 즉시 완료됨을 기대.

예외가 발생하면 즉시 호출자에게 전달


 private Task RunTasksAsync()

설명

 ✓ 반환 형식이 Task인 비동기 메서드입니다.

 ✓ async 키워드를 사용하지 않았으므로, 명시적으로 Task를 반환해야 한다.

사용 의도

비동기 작업을 수행하고 호출자에게 완료 여부를 알리고 싶을 때 사용.

async 키워드를 사용하지 않으므로, 명시적으로 Task를 반환해야 한다.

예제

private Task RunTasksAsync()
{
    return Task.Delay(1000); // 1초 대기
 }

 

기대 효과

 ✓ 비동기 작업을 수행하고, 호출자는 해당 작업이 완료될 때까지 비동기적으로 대기할 수 있다.

 ✓ 호출자가 await 키워드를 사용하여 메서드를 호출할 수 있다.

 ✓ 예외가 발생하면 await에 의해 호출자에게 전달됨.


private async void RunTasksAsync()(이벤트 핸들러에서 사용) 작업 완료 대기 불가

설명

async 키워드와 void 반환 형식을 사용한 비동기 메서드다.
메서드 내부에서 await 키워드를 사용할 수 있으며, 비동기 작업을 처리할 수 있다.

사용 의도

주로 이벤트 핸들러에서 사용.
호출자가 비동기 작업의 완료 여부를 알 필요가 없는 경우 사용

호출자는 해당 메서드가 비동기적으로 실행됨을 알지 못한다.

예제

private async void RunTasksAsync()
  {
    await Task.Delay(1000); // 1초 대기
    Console.WriteLine("RunTasksAsync 완료");
  }

 

기대효과

비동기 작업을 수행하지만, 호출자는 작업 완료를 알 수 없습니다.
예외 처리가 어렵습니다. 예외가 발생하면 호출자에게 전파되지 않습니다.

결과

호출자는 메서드가 비동기적으로 실행됨을 기대하지 않습니다.
예외가 발생하면 호출자에게 전파되지 않습니다.

 

async void 이벤트 핸들러의 의미

비동기 작업 수행: async void 메서드는 이벤트 핸들러 내에서 비동기 작업을 수행할 수 있게 한다.

예를 들어, 버튼을 클릭하면 파일을 읽거나 네트워크 요청을 비동기적으로 수행할 수 있다.
작업 완료 대기 불가: async void 메서드는 호출자가 작업의 완료 여부를 기다릴 수 없으며, 이는 이벤트 핸들러의 특성상 적합.
이벤트 핸들러는 비동기 작업의 결과를 기다릴 필요 없이 즉시 반환됨.

예외 처리: async void 메서드 내에서 발생한 예외는 호출자에게 전달되지 않음.

private async void LoadButton_Click(object sender, EventArgs e)
  {
    try
   {
    statusLabel.Text = "Status: Loading...";
    await LoadDataAsync();
    statusLabel.Text = "Status: Load complete!";
   }
    catch (Exception ex)
   {
    statusLabel.Text = $"Status: Error - {ex.Message}";
   }
  }

private async Task LoadDataAsync()
{
   // Simulate a long-running task
   await Task.Delay(3000); // 3초 대기
}

private Task<T> RunTasksAsync()

설명

Task<T> 반환 형식을 사용한 비동기 메서드입니다.
메서드 내부에서 await 키워드를 사용할 수 있으며, 비동기 작업을 처리하고 결과를 반환할 수 있습니다.

사용 의도

비동기 작업을 수행하고 결과를 호출자에게 반환하고 싶을 때 사용합니다.

호출자는 await 키워드를 사용하여 작업이 완료될 때까지 대기하고 결과를 받을 수 있습니다.

예제

private async Task<int> RunTasksAsync()
{
await Task.Delay(1000); // 1초 대기
return 42;
}

 

기대 효과

비동기 작업을 수행하고, 결과를 호출자에게 반환.

예외 처리를 쉽게 할 수 있다.

결과

호출자가 await 키워드를 사용하여 메서드를 호출하고, 작업 결과를 받을 수 있습니다.
예외가 발생하면 await에 의해 호출자에게 전파됩니다.

요약

  • async Task: 비동기 작업을 수행하고 호출자가 작업 완료를 기다릴 수 있게 합니다. 주로 비동기 메서드에서 사용.
  • void: 동기 메서드로, 비동기 작업을 수행하지 않음. 즉시 완료.
  • Task: 비동기 작업을 수행하고 호출자가 작업 완료를 기다릴 수 있게 함.
           async 키워드를 사용하지 않는 비동기 메서드에서 사용됨
  • async void: 비동기 작업을 수행하지만 호출자가 작업 완료를 알 수 없음. 주로 이벤트 핸들러에서 사용됨.
  • Task<T>: 비동기 작업을 수행하고 결과를 호출자에게 반환. 호출자가 작업 완료를 기다리고 결과를 받을 수 있게 한다.
각 메서드 타입은 특정 상황에서 유용하며, 사용 의도에 맞게 선택해야 한다.
비동기 작업이 필요할 때는 async Task 또는 Task<T>를 사용하고, 호출자가 작업 완료를 기다리지 않아도 될 때는 async void를 사용할 수 있다. 동기 작업이 필요할 때는 void를 사용.

728x90

댓글