728x90
1. 동기와 비동기
일반적으로 코드는 동기적으로 실행됩니다. 동기적으로 실행된다는 말은 아래 그림처럼 요청 후 반환받은 후 다음을 실행한다는 뜻입니다.
반면에 비동기는 요청을 보낸후 반환을 기다리지 않습니다.
숫자를 보시면 반환되는 순번은 적혀있지 않습니다. 왜냐하면 코드가 실행되는데 걸리는 시간에 따라 반환 순서가 달라질 수 있기 때문입니다.
이러한 이유로 비동기는 동기보다 일반적으로 속도가 빠릅니다. 동기에 비해 대기하는 시간이 적기때문입니다.
반면에 비동기의 단점으로는 순서를 보장할 수가 없습니다.
2. 비동기 사용방법
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 WindowsFormsApp3
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//메서드를 참조
delegate void mySettingDelegate(string str);
private void Form1_Load(object sender, EventArgs e)
{
string mystr = "";
//AsyncCallBack -> 비동기작업이 모두 끝난후 실행할 함수 지정
AsyncCallback callback = new AsyncCallback(callbackFunction);
//비동기
mySettingDelegate msd = mySetting;
//네트워크 통신에서 주로 사용
//BeginInvoke는 비동기로 실행
//callbackFunction("aaa") 실행
//비동기 작업이 끝났는지 확인
IAsyncResult ir = msd.BeginInvoke(mystr, callback, "aaa");
bool state = ir.AsyncWaitHandle.WaitOne(TimeSpan.FromSeconds(3)); //3초 후 비동기 작업이 끝나있는지 확인
//비동기 작업이 끝났다면 true 반환 끝나지 않았다면 false 반환
if (!state) //false 일경우
{
MessageBox.Show("작업이 실행중임");
}
label1.Text = mystr;
}
//콜백 함수
private void callbackFunction(IAsyncResult ir)
{
string str = (string)ir.AsyncState; //aaa 출력
MessageBox.Show(str);
}
private void mySetting(string str)
{
for(int i = 0; i < 100; i++)
{
str += "a";
}
//다른 스레드에서 메서드 실행
label1.Text = str;
//익명함수
this.BeginInvoke((Action)(() =>
{
for(int i = 0; i < 100; i++)
{
str += "a";
}
}));
Thread.Sleep(5000);
}
}
}
'C# Programming > C#' 카테고리의 다른 글
[C#] Timer (0) | 2024.05.15 |
---|---|
[C#] 이벤트 게시 및 수신 (0) | 2024.05.15 |
[C#] 멀티스레드 (0) | 2024.05.14 |
[C#] 데이터 베이스 연결 및 기본 CRUD (1) | 2024.05.14 |
[C#] 객체지향 프로그래밍 (0) | 2024.05.14 |