WPF Q&A

Thread 에서 UI변경 2번째.... hoon 평점: 없음 조회: 131
Dispatcher.BeginInvoke() 를 사용 하면 된다는 댓글이 있어 코드를 다음과 같이 변경을 했는데...
UI 변경도 되지를 않고 엑셀파일 작업이 완료 되는동안 화면도 움직이지를 않습니다..
뭐가 잘못 된걸까요?


      this.Dispatcher.BeginInvoke(new Action(() =>
      {
                this.textBox1.Text =text;
       }));


※ 위 쪽 코드는 엑셀파일의 줄 번호를 화면에 보여주기 위해 만들고 있는대 동기작업(아래쪽 코드)
    인경우 화면상에 1초에 수천번 call 을 해서 마치 Stop Watch 움직임처럼 빠르게 동작을 합니다.

------------------------  이전 질문 ---------------------------------------

Thread  에서  엑셀파일을 읽어서 화면에 뿌리는 작업을 하고 있습니다.

그런데 문제가 데이타가 많은경우 아래코드 사용 하면 ui가 변경 되는동안(엑셀파일을 전부 완료)
에는 화면이동이나 다른 버튼의 사용이 되지를 않는데 방법이 없을까요?
private void settext(string text)
{
            this.Dispatcher.Invoke(() => {
                    this.textBox1.Text =text;
            });
 }
 
태그 : thread ui
작성자 정보
hoon
Level 21
 [EXP.11/50]

메일:  비공개
글등록 +12 468 덧글등록 +3 41
자기소개
글 공유하기 |
  tweet facebook
2018-06-26 오전 11:11:45
나도한마디
사용자
darkmong            [2018-06-26]
Level 5
 [EXP.11/16]
정확히 어떤 상황에서 사용하고 계신건지 모르겟습니다^^
다만, 추측하여 설명드리면...

UI 변경도 되지를 않고 화면도 움직이지 않는다는 것은 다른 thread객체에서 작업중인 상황에서 ui thread 조작을 하게 된게 아닌가 생각됩니다. 아래는 임의로 생각해본 예제입니다.

delegate void Work();
private void Button1_Click(object sender, RoutedEventArgs e)
{
tb.Text = "시작";
new Work(Processing).BeginInvoke(null, null);
}

private void Processing()
{
Thread.Sleep(6000);
tb.Text = "끝"; // 이 경우 InvalidOperationException이 발생합니다.
//Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() => tb.Text = "끝")); // 올바르게 동작
}

위 경우 다른 thread에서 작업하고 있는 중에 textbox(tb)의 ui에 접근해야 되는 상황이 되어 오류가 발생해야 정상입니다. 그러나 어디에서도 예외를 잡을 수 없는(?) 상황이 되어 모르고 있는 것입니다.
쉽게 설명하여 VS에서 F5로 디버그 모드로 실행하시면 해당 부분에서 예외를 보실 수 있을 겁니다.

해당 내용은 일단 dispatcher의 동작원리 부터 조금 이해하시면 좋을 것 같습니다.
사용자
darkmong            [2018-06-26]
Level 5
 [EXP.11/16]
추가로, 위 방법을 응용하는 것보다 async/await이 지원되지 않는 저버전을 사용하는 것이 아니라면 아래와 같이 오래 걸리는 작업을 Task를 활용하여 심플하게 처리가 가능합니다.

private void Button1_Click(object sender, RoutedEventArgs e)
{
tb.Text = "시작";
Processing();
}

private async void Processing()
{
await Task.Delay(6000); // 오래걸리는 작업
tb.Text = "끝";
}
사용자
hoon            [2018-06-27]
Level 21
 [EXP.11/50]
감사합니다.
재가 지금 하고자 하는 작업은 밀리초 단위까지 표시 하는 디지털 시계를 만들고자 합니다,

알려주신 내용을 실행해보면 버튼을 누르면 "시작"이 표시되고, 6초 후에 "끝"
정상 작동 합니다.

여기서 추가로 Processing 메소드에서 Thread.Sleep(6000); 으로 6초를 기다리는 동안 시간을 밀리초단위로 화면에 출력을 하면서 다른 작업(화면이동이나 다른기능 실행 )도 할수 있을까요?

태그로 엮인글
[C#.NET Q&A] C# thread 내부 for문, 다른 thread에서 제어[4]+2  양푸카
[WPF Q&A] Thread 에서 UI변경 3번째....[2]+1  hoon
[WPF Q&A] Thread 에서 UI변경[1]  hoon
[자유게시판] "XAML 뽀개기"라는 제목으로 블로그를 운영하고 있습니다~[2]  찰스82
[C#.NET Q&A] 스레드 시작, 종료는 어떻게 하나요?[4]  insurang
[C#.NET Q&A] winform UI 디자인 할 때 relative로 배치 할 수는 없나요?[2]+2  굿모닝
[WPF Q&A] Thread 진행중인 Dispatcher.invoke Kill또는 해결방법[1] 파일첨부 자바송장
[WPF Q&A] 빠른 모델 변경시 전 Dispatcher.invoke 죽이는 방법좀 알려주세요 ㅠㅜ  자바송장
[C#.NET Q&A] 다른 thread에서의 UI접근[1]+3  toez
[C#.NET Q&A] Graphics.DrawLine(m_pen, x, y) 부분에서의 ThreadException [1]  toez
글리스트
스택패널 바깥을 누르면 스택패널 Visible 를 Visible.Collapsed 으로 변경하고 싶습니다.[2]+1  insurang
상대경로 구하기[1]  왕초보자
윈도우와 윈도우, 윈도우와 페이지, 페이지와 페이지간에 데이터 주고받기[4]+1  왕초보자
서브윈도우에서 메인윈도우의 컨트롤을 제어하고 싶습니다[1]  왕초보자
멀티쓰레드? 비동기? 로 새창을 열고싶습니다.[1]+2  왕초보자
새창에서 gif사용[1]  왕초보자
Grid 안에 위치한 TextBox 가 입력된 글자에 의해 Width 가 변합니다...[2]+2  비가와요
Grid에서 페이징처리 궁금한점이 있습니다.[2]+2  방랑이z
Thread 에서 UI변경 3번째....[2]+1  hoon
 ★현재글->   Thread 에서 UI변경 2번째....[2]+1  hoon
Thread 에서 UI변경[1]  hoon
wpf에서 객체 자체를 바인딩[1]  이기현
c# wpf http통신으로 img받아오기[1]  이기현
c# viewModel에서 윈도우 참조질문입니다.[7]+2  이기현
사용자 정의 콘트롤의 DependencyProperty 작동이 잘 안됩니다..[2]+1 파일첨부 비가와요
코드 복사했는데 디자인이 다르네요? ( 파일, 이미지 있음 )[1]+1 파일첨부 insurang
TextBox 의 ToolTip 을 Binding 하는경우 Null 처리는 어떻게 하나요?[1]+4  비가와요
canvas에 타원을 그리는 가장 빠른방법이 궁급합니다.[2]+2  Mines
버튼 템플릿으로 들어간 객체이름을 어떻게 특정하면 되나요?[1]+1  insurang
WPF Grid 또는 DockPanel 사이즈 변경시 TextBlock Wrap하기[3]+2  한님맨