비동기 프로그래밍.코어 (1부)

14025 단어 csharpdotnet
우리는 항상 고성능의 빠른 응용 프로그램을 만들고 싶어 한다.따라서 비동기 원리를 이해하는 것이 중요하다.Net은 우리에게 제공됩니다.우리는 주요 개념, 흔히 볼 수 있는 문제, 복잡한 장면, 그리고 C#가 우리에게 제공하는 비동기적인 업무를 위한 키워드를 보게 될 것이다.

비동기 프로그래밍.순액


우선, 만약 우리가 Asp에서 일하지 않는다면, 이것은 중요하지 않다.Net에서 컨트롤러 응용 프로그램, Windows Presentation Foundation, Windows 창 응용 프로그램 또는 Xamarin에서 비동기 원칙은 모든 응용 프로그램에 적용될 수 있습니다.네트워크 환경.
그 작업 원리를 상세히 이해하기 전에 이 기능을 이용하지 않은 응용 프로그램을 살펴보자.Windows Presentation Foundation 응용 프로그램을 사용하여 동기화 연결을 할 때 어떤 일이 발생할지 자세히 알아보겠습니다.
우리의 응용 프로그램은 눈의 색깔을 통해 사람을 검색한다.검색할 텍스트 상자와 단추가 있습니다.그 밖에 우리는 결과의 격자, 작성할 텍스트 상자, 진도표를 볼 수 있습니다.우리 애플리케이션은 API를 참조하여 데이터를 검색합니다.무슨 일이 일어날지 봅시다.
검색 버튼을 눌렀을 때 실행되는 코드는 다음과 같습니다.

var client = new WebClient();
var content = client.DownloadString($"https://localhost:44356/api/customers/search/" + search);
var data = JsonConvert.DeserializeObject<IEnumerable<Customer>>(content);

CustomersGrid.ItemsSource = data;
현재 사용되지 않는 클래스인 WebClient를 사용합니다.이 종류의 문제는 사용자 인터페이스가 있는 메인 라인을 막아서 붕괴시킨다는 것이다.
그럼 저희가 뭘 할 수 있을까요?우선, 우리는 비동기적인 기술, 즉 HttpClient를 이용하기 위한 클래스를 사용할 것이다.이 클래스는 GetAsync 방법이 있습니다. 이름과 같이 비동기적인 작업입니다. 이것은 인터페이스가 있는 주 라인을 막지 않는다는 것을 의미합니다.
try {
    using (var client = new HttpClient()) {

        var result = await client.GetAsync($"https://localhost:44356/api/customers/search/" + search);
        var content = await result.Content.ReadAsStringAsync();
        var data = JsonConvert.DeserializeObject<IEnumerable<Customer>>(content);

        CustomersGrid.ItemsSource = data;
    }
} catch (Exception ex) { 
}
우리는 우리의 새 코드에서await 키워드를 찾았다는 것을 볼 수 있다.이것은 우리가 조회한 API에서 데이터를 불러온 후에 코드의 이 부분을 되돌려 주기를 희망하는 가장 좋은 방법이다.이제 자물쇠 생성을 피하기 위해 코드를 작성한 행동을 살펴보겠습니다.

컨설팅 서비스에서 UI가 차단되지 않았음을 알 수 있습니다.우리는 또한 진도표가 데이터 해석을 기다리는 동안 중단 없이 운행하는 것을 볼 수 있다.
사실상, 당신이 분명히 알고 있는 바와 같이, 응용 프로그램에 대한 작은 변경을 통해 우리는 비동기적인 원칙을 이용하여 이런 상황에서 더욱 좋은 사용자 체험을 제공할 수 있습니다.

비동기적으로 대기합니다.순액


코드의 실행 상황을 살펴보겠습니다. 단추의 클릭 이벤트를 설명합니다.
private async void button_Click(object sender, RoutedEventArgs e)
{

    try
    {
        using (var client = new HttpClient())
        {

            var result = await client.GetAsync($"https://localhost:44356/api/customers/search/" + search);
            var content = await result.Content.ReadAsStringAsync();
            var data = JsonConvert.DeserializeObject<IEnumerable<Customer>>(content);

            CustomersGrid.ItemsSource = data;
        }
     }catch (Exception ex) { }

}
프라이빗 옆에 단어 async가 생겼습니다. 이것은 사건이 비동기적일 것이라는 것을 의미하지만, 이것은 우리가 정상적으로 일을 할 수 있도록 하기에는 부족합니다.이를 위해, 우리는wait라는 단어를 사용해야 한다. 우리가 이전에 평론한 바와 같이, 실행이 끝날 때까지 기다려야 한다는 통지를 책임진다.
가령 우리는async라는 단어만 있을 뿐,wait를 사용하지 않는다.Visual Studio에서 단어 wait를 기다리는 방법을 알려 줍니다.

우리가 반드시 고려해야 할 또 다른 점은 방법이다.보시다시피 이 방법은 현재 GetAsync () 라고 불리고 있습니다. 실제로는 HttpResponse Message 형식의 작업을 되돌려줍니다. 우리는 뒤에 있는 글에서 토론할 것입니다. 지금은 다른 라인에서 실행할 것이라고 말할 뿐입니다.
응용 프로그램에서 논의한 비동기식 원칙은 Windows 응용 프로그램이나 모바일 응용 프로그램뿐만 아니라이러한 비동기식 원리는 모든 유형의 입력/출력 작업에 적용된다.예를 들어 디스크 액세스, 데이터베이스 액세스, 메모리 또는 서비스 등이 있습니다.
ASP의 서버 측 코드에도 동일한 원리를 적용할 수 있습니다.순액호출 중인 RESTAPI의 코드를 살펴보겠습니다. 이 코드는 인원 목록으로 돌아갑니다.
[Route("api/customers/search/{valor}")]       
public async Task<IList<Customer>> Get(string valor)
{
    List<Customer> items;

    using (StreamReader r = new StreamReader(@"customers.json"))
    {
        var json = await r.ReadToEndAsync();
        items = JsonConvert.DeserializeObject<List<Customer>>(json);
    }

    return items.Where(p => p.EyeColor == valor).ToList();
}
우리는 이미 컨트롤러 방법을 비동기적이라고 성명했다.또한 유형은 Task입니다.이것은 ASP를 의미합니다.Net은 비동기식 작업이 진행 중인 것을 알고 모든 결과를 사용할 수 있을 때 이 방법으로 되돌아옵니다.
ASP에서 제공하는 이점Net은 정상적인 실행을 중단하지 않고 웹 서버의 과도한 부하를 줄여 데이터 분석이나 외부 접근을 기다릴 때 서비스 요청을 계속할 수 있도록 합니다.

프로세스 이해


지금까지 우리는 우리의 방법을 어떻게 비동기적으로 설명하는지 보았고, 키워드wait를 보았으며, 응용 프로그램의 메인 라인에서 실행하는 것이 아니라 단독으로 실행하는 방법을 이해했다.
wait는 비동기적인 조작이 사용될 때 그 결과를 검색할 수 있도록 합니다.그것은 또한 우리에게 현재 실행 중인 임무에 이상이나 문제가 없다는 것을 보증한다.이것은 기다리는 가장 좋은 방법일 뿐만 아니라 현재 조작을 검증하는 가장 좋은 방법이기도 하다는 것을 의미한다.
이것이 바로'연장'이라는 단어의 유래다.연장은 글자를 기다린 후에 실행되는 코드 블록입니다.

그림에서 보듯이 GetAsync (...) 라고 하는 방법은 단어 await로 표시합니다. 이것은 빨간색으로 표시된 것이 우리의Continuation 블록이라는 것을 의미합니다.마찬가지로 Rad As String Async () 방법을 찾은 곳에서await로 표시합니다. 이것은 다음 두 줄이 우리의 계속이라는 것을 의미합니다.
예를 들어 어떤 기록도 찾지 못했는지 확인하기 위해 변경을 해 봅시다.우리의 코드는 다음과 같다.
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;
        }
}
우리의 방법은 비동기적으로 호출되지만 오류로 돌아가지 않습니다.이를 위해 우리는 시도를 바꾸었다.결과를 포착하고 내부에서 호출합니다.상태 코드 () 에 다시 액세스해야 합니다.이것은 응답 코드를 검증할 것입니다. 200이 아니기 때문에 이상을 일으킬 것입니다.마지막으로, 텍스트 상자에 입력한 오류를 통해catch에 포착됩니다.

우리는 글자를 기다린 후에 코드가 실행될 것을 볼 수 있다. 이것은 다른 라인에서 작업하는 것을 걱정할 필요가 없다는 것을 느낄 수 있다. 만약 문제가 있다면, 우리는 실행 코드의 상하문을 검증하고 검색할 수 있다.

결론


우리의 응용 프로그램에서 이러한 비동기적인 모델을 이해하고 실현하는 것이 매우 중요하다.이것은 우리 응용 프로그램이 더 적은 블록과 더 좋은 사용자 체험을 가지게 될 뿐만 아니라, 이 블록들은 추가 비용을 발생시킬 수 있기 때문이다.만약 우리가 구름 위에서 일한다면, 우리는 우리가 낭비한 자원이 많을수록, 우리가 지불한 대가가 더욱 크다는 것을 반드시 잊지 말아야 한다.이것은 우리의 응용 프로그램을 사용하여 원가를 절약하는 좋은 방법이다.
다음 문장에서 우리는 어떻게 우리 자신의 비동기적인 방법을 만들고 이상을 어떻게 처리하는지, 그리고 그 최선의 실천을 보게 될 것이다.

좋은 웹페이지 즐겨찾기