2016-10-28 2 views
0

안녕하세요, 얘들 아, UI 스레드를 처리하는 방법을 이해할 수 없으므로 자식 스레드에서 많은 UI 요소를 만들려고합니다. 다음 코드를 수정하여 창이 닫히지 않도록하는 방법 :주 스레드를 차단하지 않고 많은 수의 컨트롤을 만들려면 어떻게해야합니까?

public void CreateCtr(string name) 
    { 
     Button btn = new Button(); 
     btn.Content = name; 
     btn.Width = 10; 
     btn.Height = 10; 
     content.Children.Add(btn); 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     int count = 100000; 
     Task.Factory.StartNew(()=> { 
      for (int i = 0; i < count; i++) 
      { 
       this.Dispatcher.BeginInvoke(new Action(()=> { 
        CreateCtr(i.ToString()); 
       })); 
      } 
     }); 
    } 
+7

진지하게 왜 10 만 개의 버튼이있는 폼이 필요한가요? – NineBerry

+0

사실, 나는 그저 할 수있는 방법이 있는지 알고 싶다. – Joker

+0

100.000 버튼을 만들 수는 없으며 시간과 관련이 없습니다. 사용자가 할 수없는 사실과 관련이 있습니다. –

답변

0

숨을 쉬려면 UI 스레드에 공간을 제공해야합니다. 현재 코드에서 UI 스레드는 모든 생성 버튼 작업을 처리하는 중이고 사용자 입력을 처리 할 수 ​​없습니다. 각각의 개별 버튼을 만드는 것 사이에 최소한의 일시 중지를하십시오. 몇 밀리 초이면 충분합니다.

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    int count = 100000; 
    Task.Factory.StartNew(() => { 
     for (int i = 0; i < count; i++) 
     { 
      this.Dispatcher.BeginInvoke(new Action(() => { 
       CreateCtr(i.ToString()); 
      })); 
      Thread.Sleep(5); 
     } 
    }); 
} 

일시 중지 시간이 길어질수록 양식 응답 성이 좋아집니다.

폼에있는 일정량의 구성 요소를 추가 한 후에 다른 구성 요소를 추가하는 데 시간이 오래 걸리기 때문에 양식이 잠시 후에 다시 반응하지 않게됩니다. 이것은 원래의 코멘트가 관련성이있는 곳입니다. 양식에 많은 구성 요소를 사용하는 데 필요한 용도가 없으므로 프레임 워크가이를 잘 처리하도록 설계되지 않았습니다.

동일한 상위 컨테이너에 모든 버튼을 배치하지 않고 각 구성 요소에 100 개의 하위 요소가있는 구성 요소 트리를 만드는 것이 효과가있을 수 있습니다. 그러나 다시 : 관련 유스 케이스가 보이지 않습니다.

+0

Q : 개별 단추를 만드는 동안 큰 작업이 아니므로 양식에없는 버튼 배열을 만든 다음 한꺼번에 20/50/100을 대량으로 추가하는 것이 더 효과적입니까? – BugFinder

+0

@BugFinder 성능 향상에 도움이된다고는 생각하지 않지만 테스트는 무료입니다. :) 작동 할 수있는 것은 모든 버튼을 동일한 상위 컨테이너에 넣지 않고 각 구성 요소에 100 개의 하위 요소가있는 구성 요소 트리를 만드는 것입니다. 그러나 다시 : 관련 유스 케이스가 보이지 않습니다. – NineBerry

0

컨트롤을 추가 할 때 디스패처를 사용하지 않도록 설정할 수 있습니다.

int count = 100000; 
Task.Factory.StartNew(() => { 
    using (var d = Dispatcher.DisableProcessing()) 
    { 
     for (int i = 0; i < count; i++) 
     { 
      this.Dispatcher.BeginInvoke(new Action(()=> { 
       CreateCtr(i.ToString()); 
      })); 
     } 
    } 
}); 
관련 문제