.Net Core의 비동기 프로그래밍(2부)

8736 단어 csharpdotnet
이전 게시물에서 우리는 .Net이 비동기적으로 작동해야 하는 기능에 대한 작은 소개를 보았습니다. 이 게시물에서는 비동기 메서드를 생성하는 방법, 예외를 처리하는 방법 및 이 패러다임을 사용할 때의 모범 사례를 살펴봅니다.

우리의 비동기 방식



우리는 코드가 너무 길지 않아야 한다고 항상 생각해야 합니다. 코드는 가능한 한 깨끗해야 하므로 이전 게시물의 코드를 다음과 같이 리팩토링할 것입니다.

private async void button_Click(object sender, RoutedEventArgs e)
{

    using (var client = new HttpClient())
    {
        var result = await client.GetAsync($"https://localhost:44356/api/customers/search/" + search);

        try {
             result.EnsureSuccessStatusCode();
             var content = await result.Content.ReadAsStringAsync();
             var data = JsonConvert.DeserializeObject<IEnumerable<Customer>>(content);
             CustomersGrid.ItemsSource = data;
         } catch (Exception ex) {
            txtOut.Text += ex.Message;
        }
    }

}

몇 가지 사항을 변경하고 GetPeople()이라고 하는 메서드를 만들 것입니다. 우리는 응용 프로그램이 별도의 메서드에 있음에도 불구하고 동작을 수정하지 않도록 할 것입니다. 코드를 수정할 것입니다. 다음과 같이 표시됩니다.

private async void button_Click(object sender, RoutedEventArgs e)
{
    await GetPeople(search);
}

public async Task GetPeople(string search) {

    using (var client = new HttpClient())
    {
        var result = await client.GetAsync($"https://localhost:44356/api/customers/search/" + search);

        try
        {
             result.EnsureSuccessStatusCode();
             var content = await result.Content.ReadAsStringAsync();
             var data = JsonConvert.DeserializeObject<IEnumerable<Customer>>(content);
            CustomersGrid.ItemsSource = data;
        }
        catch (Exception ex)
        {
            txtOut.Text += ex.Message;
        }
    }
}

가장 먼저 눈에 띄는 것은 GetPeople() 메서드가 async 및 Task로 선언되었다는 것입니다. 참고: void 유형을 반환하는 비동기 메서드를 사용해서는 안 되며 이벤트 처리기일 때만 사용해야 합니다.

작업으로 선언하면 메서드가 자동으로 진행 중인 작업에 대한 참조를 반환하고 어느 시점에서 확인을 기다리며 호출됩니다. Visual Studio는 오류를 표시하지 않습니다. 이는 비동기 작업으로 선언된 메서드가 무언가를 명시적으로 반환해야 하고 컴파일러가 이를 처리하기 때문입니다.

click 이벤트에서 GetPeople()을 호출하고 await 키워드로 선언하여 코드가 기다리도록 합니다. 아무 것도 변경되지 않은 이미지를 살펴보겠습니다.



비동기 메서드를 생성하여 코드를 리팩토링하는 것은 매우 쉽습니다. 그렇게 함으로써 우리는 코드를 좀 더 읽기 쉽게 만들었습니다. 이 접근 방식은 .Net, ASP.Net, 콘솔, Xamarin 등의 모든 환경에 적용할 수 있음을 다시 한 번 기억하십시오.

예외



우리의 방법은 실패할 수 있습니다. 우리 메서드가 API를 호출하지만 현재 사용할 수 없다고 가정합니다. 우리의 신청은 실패할 것입니다. 이러한 이유로 await 키워드는 매우 중요합니다. 이렇게 하면 예외가 처리되고 사용하지 않으면 응용 프로그램은 예외가 발생했음을 알 수 없습니다.

Visual Studio는 작업을 반환하는 메서드에 대한 호출이 있고 await라는 단어로 호출되지 않을 때 경고합니다.



또 다른 예는 try..catch 블록을 사용하면 어떻게 될까요?

try
{
    GetPeople(search);
}
catch (Exception)
{
    throw;
}

정확히 같은 일이 발생하며 예외는 처리되지 않습니다. 그러나 await 키워드를 추가하면 예외를 처리할 수 있습니다.

또 다른 중요한 점은 비동기 메서드가 무효가 되어서는 안 된다는 것입니다. 그 이유는 void 메서드는 아무것도 반환하지 않기 때문에 예외로 처리할 수 없기 때문입니다. Task를 사용하여 무언가가 반환되는지 확인합니다.

이러한 이유로 await 및 async 작업 조합이 매우 중요합니다. 이 조합 덕분에 예외를 처리할 수 있습니다. 이 메서드는 유형을 반환하고 호출되면 어떤 일이 발생할 때까지 기다립니다.

모범 사례 및 결론



.Net에서 이러한 사례를 사용할 수 있는 경우:
  • Windows Presentation Foundation
  • Windows 양식
  • 자마린
  • 콘솔 앱
  • Asp.Net

  • 필요한 모든 유형의 .Net 응용 프로그램에서 사용할 수 있습니다. 유일한 차이점은 ASP.Net에는 사용자 인터페이스가 없지만 웹 서버의 부하를 줄이는 데 도움이 된다는 것입니다.

    잘못된 것과 올바른 것을 요약해 보겠습니다.



    이 정보가 귀하에게 유용하고 발생하는 모든 요구 사항을 다루기를 바랍니다. 향후 게시물에서는 동기 및 병렬 프로그래밍에 대한 더 많은 주제를 다룰 것입니다.

    좋은 웹페이지 즐겨찾기