C\#비동기 교체 IAsync Enumerable 응용 실현

최근 WPF 로 금 세 판 을 만 드 는 개발 에는 이런 수요 가 있 는데,대량 개표 할 때마다 금 세 판 을 한 번 씩 연결 해 야 한다.
예 를 들 어 저 는 영수증 a,b,c,d 이 다섯 장의 영수증 이 있 습 니 다.매번 영수증 을 발급 할 때마다 금 세 판 의 밑바닥 을 사용 해 야 정상적으로 개표 할 수 있 습 니 다.
우선 첫 번 째 방법 을 써 보 세 요.

private  void Button_Click(object sender, RoutedEventArgs e)
        {
            var dateStart = DateTime.Now;  //         
            DebugText = string.Empty;
            List<string> fpList = new List<string>() { "a", "b", "c", "d" };

            foreach (var item in MockIO)
            {
                var dateEnd = DateTime.Now;
                var timeSpan = dateEnd - dateStart;//      
                DebugText += item + " " + timeSpan.TotalSeconds + "\r
"; } } /// <summary> /// /// </summary> /// <param name="ls"></param> /// <returns></returns> public static IEnumerable<string> MockIO(List<string> ls) { foreach (var item in ls) { Task.Delay(1000).Wait(); yield return item; Debug.WriteLine(Thread.GetCurrentProcessorId()); } }
효 과 를 보다

UI 차단 이 발생 한 것 은 분명 하 다.우 리 는 코드 에 대해 어떠한 비동기 처리 도 하지 않 았 기 때문이다.이어서 우 리 는 수정 을 시도 하기 시작 했다.
우선,우 리 는 일반적인 비동기 방법 에 따라 MockIO 함 수 를 수정 하고 async 키 워드 를 추가 하 며 결 과 를 되 돌려 Task 를 추가 하고 내부 에서 IO 작업 에 await 를 추가 하려 고 합 니 다.
수정 이 끝 난 후 컴 파일 이 통과 되 지 않 았 습 니 다.VS 이 방법 에 대해 이상 을 보고 합 니 다.

알림 정 보 를 통 해 우 리 는 반환 값 Task>이 교체 할 수 있 는 것 이 아니 라 yield 를 사용 하여 값 을 되 돌려 주 었 기 때문에 교체 할 수 있 는 반환 값 이 필요 합 니 다.
이렇게

그러나 이렇게 한 번 에 한 팀 의 Task 로 돌아 가 편리 한 yield 를 사용 하지 않 았 습 니 다.
이때 IAsyncEnumerable 로 디자인 할 수 있 습 니 다.IAsyncEnumerable 은 C\#8.0 에 도 입 된 새로운 특성 으로 비동기 교체 에서 매우 편리 합 니 다.위 코드 와 같이 직접 수정 할 수 있 습 니 다.

public static async IAsyncEnumerable<string> MockIOAsync(List<string> ls)
        {
            foreach (var item in ls)
            {
                Task<Task<string>> task = Task<Task<string>>.Factory.StartNew(async () =>
               {
                   await Task.Delay(1000);
                   return item;

               });

                yield return await task.Result;
            }
        }
우 리 는 다시 디 버 깅 을 실행 해서 효 과 를 보 자.

UI 가 막 히 지 않 았 을 뿐만 아니 라 전 달 된 값 도 우리 의 기대 에 부합 되 는 것 을 볼 수 있 습 니 다.
확장:위 단계 에서 우리 가 완성 한 UI 의 비 차단 적 인 실현 이지 만 전체 개표 사용 시간 은 절약 되 지 않 았 습 니 다.
다음 에 저 는 MockIOAsync 방법 을 계속 수정 하여 교체 기 내부 의 다 중 스 레 드 작업 을 실현 할 것 입 니 다.
수 정 된 코드 는 다음 과 같다.

public static async Task<IEnumerable<string>> MockIOPerformanceAsync(List<string> ls)
        {
            List<string> lss = new List<string>();
            List<Task> tasks = new List<Task>();
            foreach (var item in ls)
            {

                Task task = new Task(() =>
              {
                  Task.Delay(1000).Wait();
                  Debug.WriteLine(Thread.GetCurrentProcessorId());
                  lss.Add(item);
              });
                tasks.Add(task);
                task.Start();

            }
            foreach (var item in tasks)
            {
                await item;
            }
            return lss;
        }
효과 표시:

네,속도 가 빠 르 지만 정렬 이 어 지 러 워 졌 습 니 다.이 방법 은 옮 겨 다 니 는 동안 스 레 드 를 새로 만 들 었 기 때문에 list 추가 가 교체 기 순서대로 추가 되 는 것 을 보장 하지 않 습 니 다.득실 이 있다.
C\#비동기 교체 IAsyncEnumerable 응용 프로그램의 실현 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 C\#비동기 교체 IAsyncEnumerable 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부탁드립니다!

좋은 웹페이지 즐겨찾기