반응형

async, await 키워드로 비동기 코드(TCP 접속) 테스트(프레임워크 4.5이상)

비동기 루틴 내에서 UI에 접근시 MainUI 스레드 에러 방지 코드(InvokeRequired)

 

//tcp연결 예제
async void connectTcp() {
 
    TcpClient tcp = new TcpClient();
    Label status = labelStatus;//상태표시 라벨
 
    await Task.Run(() => {
        try {
            setLabel(status, "연결중...", Color.Transparent);
            tcp.Connect(IPAddress.Parse("192.168.0.100"), 5000);
        } catch(Exception e) {
        }
        if(tcp.Connected) {
            setLabel(status, "연결성공", Color.LightGreen);
        } else {
            setLabel(status, "연결실패", Color.LightPink);
        }
    });
}
 
//비동기에서 UI접근시 MainUI스레드 에러 방지
//(바로 UI에 접근시 MainUI스레드 에러발생!)
private void setLabel(Label label, String text, Color backColor) {
    if(this.InvokeRequired) {
        this.Invoke(new EventHandler(delegate {
            if(text != null) label.Text = text;
            if(backColor != null) label.BackColor = backColor;
        }));
    } else {
        if(text != null) label.Text = text;
        if(backColor != null) label.BackColor = backColor;
    }
}
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기