출처 : 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;

            }

        }

    }

}

 





 








Posted by motolies
,