-
for-scope-task프로그래밍 2024. 3. 6. 18:17
1.
for(var i=0; i<=10; i++) { var task = Task.Run(async () => { var r = await StartTestConvert(i); Console.WriteLine(r); }); } Console.ReadLine(); static Task<int> StartTestConvert(int i) { return Task.FromResult(i); }
이것과
2.
for(var i=0; i<=10; i++) { var n = i; var task = Task.Run(async () => { var r = await StartTestConvert(n); Console.WriteLine(r); }); } Console.ReadLine(); static Task<int> StartTestConvert(int i) { return Task.FromResult(i); }
이것의 차이는?
1번 코드의 for문 안의 Task는 백그라운드 작업이다. 따라서, 동시성이 없다.
그러므로 for문은 Task를 생성하고 Task가 실행하기 전에 loop가 종료된다.
또한 for문 안의 lamda식의 캡처는 변수 i를 기준으로 할 때 최종값 10만 표시되는데, lamda식이 변수의 참조를 캡처하고 있는 상태이다. 즉, "값"이 아닌 "주소"를 참조 하므로 변경된 최종값 10만 표시되게 된다.
2번 코드는 for문 안에서 값을 복사하여 Task 백그라운드 작업을 생성하고 있다.
lamda식 캡처는 복사된 "값"을 기준으로 하고 각 Task는 증가값을 가지고 생성되므로 loop에서 발생한 증가값이
모두 표시된다.
따라서, 변수 스코프에 따라 lamda 변수 캡처가 어떻게 되는지 의미 있는 예제이다.
만약 foreach를 사용한다면 1번 상황은 발생하지 않는다.
'프로그래밍' 카테고리의 다른 글
Node 앱을 위한 타입스크립트 설정 (0) 2024.03.26 Javascript 최적화 (0) 2024.03.26 ASP.NET 개발에서 왜 DataTable을 사용하지 말아야 할까?-1 (0) 2024.03.05 예매, 예약 시스템에 대한 고찰 - 1 (0) 2024.03.03 ASP.NET MVC에서 ASP.NET CORE MVC + WEBAPI의 여정 - 파트2 (1) 2024.02.16