비동기 호출의 병렬 처리 하기 입니다.
아래의 예제는 병렬 처리 하기 전입니다.
using System;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
namespace TaskSample
{
class Program
{
static void Main(string[] args)
{
int result3 = Method3();
int result5 = Method5();
Console.WriteLine(result3 + result5);
}
private static int Method3()
{
Thread.Sleep(3000); // 3초가 걸리는 작업을 대신해서 sleep 처리
return 3;
}
private static int Method5()
{
Thread.Sleep(5000); // 5초가 걸리는 작업을 대신해서 sleep 처리
return 5;
}
}
}
병렬로 처리 했을 경우 8초 걸릴 작업을 5초로 줄일 수 있습니다.
아래의 예제는 병렬 처리 방식이며 Task<TResult> 타입으로 구현한 예제 입니다.
using System;
using System.Threading;
using System.Threading.Tasks;
namespace TaskSample
{
class Program
{
static void Main(string[] args)
{
// Task를 이용해 병렬로 처리하기
var task3 = Method3Async();
var task5 = Method5Async();
// task3 작업과 task5 작업이 완료될 때까지 현재 스레드를 대기
Task.WaitAll(task3, task5);
Console.WriteLine(task3.Result + task5.Result);
}
private static Task<int> Method3Async()
{
return Task.Factory.StartNew(() =>
{
Thread.Sleep(3000);
return 3;
});
}
private static Task<int> Method5Async()
{
return Task.Factory.StartNew(() =>
{
Thread.Sleep(5000);
return 5;
});
}
}
}
위의 예제는 모든 작업이 완료 될때까지 대기를 해야합니다.
Task<TResult>와 await을 사용하여 동시에 비동기 호출로 처리할 수 있습니다.
using System;
using System.Threading;
using System.Threading.Tasks;
namespace TaskSample
{
class Program
{
static void Main(string[] args)
{
// await을 이용하여 병렬로 비동기 호출: 5초 소요됨.
DoAsyncTask();
Console.ReadLine();
}
private static async Task DoAsyncTask()
{
var task3 = Method3Async();
var task5 = Method5Async();
await Task.WhenAll(task3, task5);
Console.WriteLine(task3.Result + task5.Result);
}
private static Task<int> Method3Async()
{
return Task.Factory.StartNew(() =>
{
Thread.Sleep(3000);
return 3;
});
}
private static Task<int> Method5Async()
{
return Task.Factory.StartNew(() =>
{
Thread.Sleep(5000);
return 5;
});
}
}
}
728x90
'C# > 책 예제' 카테고리의 다른 글
C# Task ReadAllText 메서드를 비동기로 처리하기. (0) | 2019.06.09 |
---|---|
C# Task await 없이 Task타입을 단독으로 사용하는 예제 (0) | 2019.06.09 |
C# Task 비동기 API WInform 예제 (0) | 2019.06.08 |
C# Task 비동기 API 예제 (0) | 2019.06.08 |
C# Task async 한정자와 await 연산자 사용하기. (0) | 2019.06.08 |
댓글