반응형
Sum을 구하는 코드로 예시
namespace WinFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Run();
}
private void Run()
{
}
private int Calc(int n)
{
int result = 0;
for (int i = 1; i <= n; i++)
{
result += i;
// .. 작업 중
Thread.Sleep(1000);
}
return result;
}
}
}
1. 동기 작업
private void Run()
{
int sum = Calc(10);
label1.Text = sum.ToString();
}
버튼을 클릭하면 mainThread즉 UIThread가 Calc메서드를 처리하면서 다른 UI관련작업을 진행할 수 없게 된다.
2. 비동기 작업
01 async
await를 사용하기 위해서는 메서드 선언 부분에 async를 사용해주어야 한다. async를 추가하면 해당 메서드를 비동기로 만든다.
private async void ExampleAsync()
{
// 비동기 작업 수행
}
02 await
비동기 메서드에서 Task나 Task<T>의 작업이 완료되는 것을 기다린다. await가 실행되면 현재 메서드의 실행은 일시 중지되며 해당 작업이 완료될 때까지 다른 작업이 수행된다.
private async void Run()
{
var task1 = Task.Run(() => Calc(10));
int sum = await task1; // 상태를 저정한다음 다른 UI처리
label1.Text = sum.ToString();
}
Task처리 뿐만 아니라 다른 UIThread를 block하지 않기 때문에 다른 UI처리를 계속해서 진행할 수 있다. 아래와 같이 버튼을 누르고 나서 화면을 키우는 또 다른 작업이 진행됨을 확인할 수 있다.
반응형
'유니티 공부 > C# 문법' 카테고리의 다른 글
C# - Windows Forms 프로젝트 사용해보기 (0) | 2024.01.20 |
---|---|
C# 문법 - 확장 메서드(Extension Method) (0) | 2024.01.19 |
C# - Thread vs Task 클래스 + EAP/APM/TAP (0) | 2024.01.19 |
C# 문법 - 인스턴스 생성을 위한 new 키워드 (0) | 2023.12.14 |
C# - 파라미터 전달방식(ref, out, in 키워드), Pass by Value(값에 의한 전달) 및 Pass by Reference(참조에 의한 전달) (0) | 2023.12.14 |
댓글