출처 : http://www.csharpstudy.com/CSharp/CSharp-async-await.aspx
중요 부분은 밑줄 쫙~
- async
- awaut
- Task<T>.Run(() => Func);
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace ThreadTest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Proc();
}
private async void Proc()
{
// UI Thread 에서 실행
// Control.Invoke 혹은 Control.BeginInvok 필요없음
SetControl(false);
// 비동기로 Worker Thread에서 도는 task1
var task1 = Task<int>.Run(() => LongCalcAsync(3));
//또는 아래와 같이 새로운 스레드를 생성해서 사용도 가능하다.
//var task1 = Task<int>.Factory.StartNew(() => LongCalcAsync(4));
// task1이 끝나길 기다렸다가 끝나면 결과치를 sum에 할당
int sum = await task1;
// UI Thread 에서 실행
// Control.Invoke 혹은 Control.BeginInvok 필요없음
this.label1.Text = "Sum = " + sum;
SetControl(true);
}
private int LongCalcAsync(int times)
{
// ThreadPool에서 Worker Thread를 가져와
// 아래 문장들 실행함
int result = 0;
for (int i = 0; i < times; i++)
{
result += i;
Thread.Sleep(1000);
}
return result;
}
private void SetControl(bool flag)
{
foreach (Control c in this.Controls)
{
c.Enabled = flag;
}
}
}
}