Invoke 방식과 별 큰 차이가 없다...
Invoke 사용하는 곳에서 단지 BeginInvoke만 사용해 주면 된다..
하지만 BeginInvoke와 Invoke의 차이는 알고 해야 할 듯 싶다.
내가 기억하는 BeginInvoke와 Invoke의 차이는 바로 동기, 비동기 이다.
Invoke는 동기화 함수. 그리하여 Invoke 사용 시 다른 Code가 실행되지 않는다. 즉, 다른 Code들은 다 Block하여 실행하지 않고 해당 Invoke함수가 종료될때까지 프로세스가 기다린다.
BeginInvoke는 비동기화 함수. 그리하여 BeginInvoke 사용 시 다른 Code와 동시에 실행된다. 즉 다른 Code들을 Block하지 않아 해당 Invoke 함수가 종료되지 않더라도 프로세스가 계속 진행한다.
예를 들면 특정 파일을 불러올때 Invoke로 실행 시 파일을 불러오기 전까지는 아무 작업도 하지 못하고 계속 기다려야한다. 하지만 BeginInvoke로 실행 시에는 파일을 불러오면서 다른 작업들도 동시에 할 수 있다는 점이 있다.
BeginInvoke가 좋아 보이지만 Invoke도 중요하고 자주 사용되므로 각자의 사용법을 잘 알고 사용해야 할 것같다.
public partial class Window1 : Window { public delegate void TempDelegate(); public TempDelegate tempDelegate; Timer _timer = null; public Window1() { InitializeComponent(); InitTimer(); } private void InitTimer() { if (_timer != null) return; TimerCallback tcb = new TimerCallback(ThreadFunc); _timer = new Timer(tcb, null, 0, 1000); } public void ThreadFunc(Object stateInfo) { if (this.Dispatcher.Thread != Thread.CurrentThread) { tempDelegate += new TempDelegate(SetTextBox); DispatcherOperation dispatchTest = Dispatcher.BeginInvoke(DispatcherPriority.Normal, tempDelegate); dispatchTest.Completed += new EventHandler(dispatchTest_Completed); } else { SetTextBox(); } } void dispatchTest_Completed(object obj, EventArgs e) { MessageBox.Show("끝"); } private void SetTextBox() { textBox1.Text = DateTime.Now.ToString(); } }
Invoke가 BeginInvoke로 변하면서 DispacherOperation이라는 변수에 BeginInvoke값을 지정해주었다.
위와 같은 행동은 BeginInvoke시 종료 시점을 알 수 없기에
dispatchTest.Completed += new EventHandler(dispatchTest_Completed);
위와 같은 코드를 추가 하여 종료 되었을 시 특정 함수가 실행되도록 추가해준다.
이벤트 추가와 같은 것.... ( 이벤트도 공부해야하는데... )
하단의
void dispatchTest_Completed(object obj, EventArgs e) { MessageBox.Show("끝"); }
이 구문이 BeginInvoke 종료시 실행되는 함수다...
하지만 예시 구문이 좀 그렇다....
1초마다 BeginInvoke가 실행되는데....
끝이라는 MessageBox가 1초마다 나타난다...... 어차피 예시 프로그램이니깐...ㅠㅠㅠ
2014/06/09 - [Skill/C#] - WPF의 Cross Thread 문제