2011-11-14 4 views
7

을 실행하기 전에 다시 그리기와 같은 뭔가. 올바른 디자인은 백그라운드 스레드/디스패처를 시작하는 것이지만, 때로는 간단한 작업에 너무 많은 번거 로움이 있다는 것을 알고 있습니다.포스는 버튼이있을 때 긴 작업

그렇다면 버튼을 사용 중지 된 상태로 다시 그리려면 어떻게해야합니까? Button에 .UpdateLayout()을 시도했지만 효과가 없습니다. WinForms를 사용할 때 정상적으로 작동하는 System.Windows.Forms.DoEvents()도 시도했지만 효과가 없었습니다.

답변

8

다음 코드는 원하는 작업을 수행합니다. 그러나 나는 그것을 사용하지 않을 것이다. 장시간 작업에는 BackgroundWorker 클래스를 사용하십시오. 사용하기 쉽고 안정적입니다. 여기에 코드
:

public static void ProcessUITasks() {    
     DispatcherFrame frame = new DispatcherFrame(); 
     Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background, new DispatcherOperationCallback(delegate(object parameter) { 
      frame.Continue = false; 
      return null; 
     }), null); 
     Dispatcher.PushFrame(frame); 
    } 

Here 당신이 경우 BackgroundWorker를 사용하는 방법에 대한 샘플을 찾을 수 있습니다.

+0

그는 Dispatcher/Backgroundworker를 인식하고 있지만 Dispatcher/Backgroundworker를 사용하지 않았 음을 분명히 알고 있습니다. – edvaldig

+2

@edvaldig : 나는 그것을 사용하지 않기 위해 밑줄을 긋았지만, 그가 찾고있는 코드를 그에게주었습니다. 나는 이것이 당신에게서 -1의 가치가 있다고 생각하지 않습니다. 코드가 작동하지 않는다면 -1을 주겠지 만 몇 가지 추가 조언은하지 않아야합니다. 나는 이것이 공평하다고 생각하지 않는다. – HCL

+1

맞아, 내가 너무 빨리, 보상에 upvote 댓글 : – edvaldig

0

InvalidateVisual(); @HCL이 맞다. do not do this do

말처럼 백그라운드 스레드/디스패처를 사용하고 UI 스레드를 차단 해제하는 것이 좋습니다. Microsoft의 높은 수준의 비동기식 ui 프로그래밍을 위해 Reactive Extensions library을 살펴보십시오.

+0

이것은 작동하지 않습니다. 무효화는 다시 칠 영역을 무효화합니다. 그러나 그것은 그림이 아닙니다. – HCL

+0

@HCL, 나를 위해 잘 작동, 기능에 대한 설명서를 참조하십시오 : 요소의 렌더링을 무효화하고 완전히 새로운 레이아웃을 통과하도록합니다. 레이아웃주기가 완료되면 OnRender가 호출됩니다. – edvaldig

+0

당신의 UI를 닦으시겠습니까 - 스레드가 차단 되었습니까? 나는 그것을 마지막으로 .net3.5SP1에서 테스트했다. 현재로서는 효과가 없습니다. 현재 작동하는 경우 4.0으로 동작을 변경해야합니다. 그러나 이것은 나에게 큰 놀라움이 될 것입니다. – HCL

0

Windows.Forms에서 Button.Refresh() 수 있습니다.

Windows.Forms 또는 WPF에서 메시지 펌프로 반환하여 다시 그리게 할 수 있습니다. Async/Await는 HCL의 답이 끔찍하지 않고이를 가능하게하기 위해 고안되었습니다.

Private Async Function Button_OnClick 

    Button.Enabled = False 

    Await Task.Yield 

    [LONG OPERATION] 

End Function 
관련 문제