C\#비동기 교체 IAsync Enumerable 응용 실현
4714 단어 C#비동기 교체IAsyncEnumerable
예 를 들 어 저 는 영수증 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
이렇게
그러나 이렇게 한 번 에 한 팀 의 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 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부탁드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
WebView2를 Visual Studio 2017 Express에서 사용할 수 있을 때까지Evergreen .Net Framework SDK 4.8 VisualStudio2017에서 NuGet을 사용하기 때문에 패키지 관리 방법을 packages.config 대신 PackageReference를 사용해야...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.