본문 바로가기
C#/C# Windows Form

C# Invoke

by TcTT 2016. 8. 18.
반응형

C#에서 해당 스레드가 생성한 폼을 다른 스레드에서 접근하게되면 Cross Thread Problem 이 발생하게 된다. 

물론 특별한 오류가 없이 돌아가는 경우도 있지만 내부적으로 문제점이 분명이 존재하기때문에 이런 오류사항들은 반드시 유의 해야한다.

그래서 C#에서는 Invoke를 사용하는데 이에 간략하게 중요한 내용을 메모해 본다.

 

<사용법>

 

1. 해당 컨트롤의 CheckForIllegalCrossThreadCalls 속성 값을 False로 설정하여 예외를 제외 시킨다. 

->간단한 방법이긴하지만 안전하게 제어하기위해서는 비추... 


 

2.  기본적인 Invoke사용법은

 

2-1. 인자가 있는 메소드일 경우

 

delegate void SetProgressValueCallback(int Value);
private void SetValueProgress(int Value)
{
    if (this.Progressbar1.InvokeRequired)  // InvokeRequired 속성은 Invoke 메소드의 사용해야하는지 알려준다.
    {
       this.Invoke(new SetProgressValueCallback(SetProValue), new object[] { Value}); 
    }
    else
    {
        this.Progressbar1.Value = Value;
    }
}


private void SetProValue(int Value)
{
    this.Progressbar1.Value = Value;
} 

 
2-2. 인자가 없는 메소드일 경우
위의 Invoke 사용부분을 MethodInvoker 로 사용하면 간편하다.
 
 this.Invoke(new MethodInvoker( delegate { this.Progressbar1.Value = Value; }) );
 
3. Invoke를 사용해야하는 구간인지 아닌지 애매할 경우
    ex) textBox1.InvokeRequired 과 같이 각 컨트롤의 InvokeRequired  속성을 조회하여 True인경우 Invoke를 사용한다.
  
4. BeginInvoke는 Invoke를 비동기 식으로 사용하고자 할때 사용한다.
 
5. Invoke는 Control.BeginInvoke 메쏘드와 Delegate.BeginInvoke 두가지가 있으며 각각의 특징은
 
Control.BeginInvoke는 내부 핸들이 작성된 스레드에서 지정된 대리자를 비동기식으로 실행한다. 비동기식으로 바로 리턴이 된다. 또한 EndInvoke를 호출하지 않아도 된다.
 
Delegate.BeginInvoke는 Asynchronous Delegate를 만들어서 CLR이 관리하는 스레드풀에 해당 메소드를 큐잉한다. 특징으로 AsyncResult를 이용해서 Object 결과값을 넘겨 받을 수 있다.  또한 반드시 EndInvoke를 호출해야한다.
 
 
관련 자료를 찾다가 좋은 정보가 있어서 가져왔습니다.



반응형

'C# > C# Windows Form' 카테고리의 다른 글

C# 텍스트박스 원하는 값만 입력받기.  (0) 2016.11.06
간단한 예제  (0) 2016.09.19
C# string 문자열  (0) 2016.08.03
C# 오라클 데이터베이스 사용  (0) 2016.07.15
C# Textbox 숫자만 입력  (0) 2016.07.11