2012-06-08 4 views
0

BeginInvoke()를 호출 할 때 대리자가 메서드 호출과 동일한 순서로 다시 나타 납니까? 또는 대표단이 처음으로 돌아올 것이라는 보장이 없습니까?Control.BeginInvoke 실행 순서

public Form1() 
    { 
     InitializeComponent(); 

     for (int i = 0; i < 100; i++) 
     { 
      Thread t = new Thread(DisplayCount); 
      t.Start(i); 
     } 
    } 

    public void DisplayCount(object count) 
    { 
     if (InvokeRequired) 
     { 
      BeginInvoke(new Action<object>(DisplayCount), count); 
      return; 
     } 

     listBox1.Items.Add(count); 
    } 

정수 목록은 순서가 바뀌어 올 것입니다.

+1

'BeginInvoke()'는 별도의 스레드에서 델리게이트를 실행합니다. 대표단이 돌아 오는 순서에 대한 보장은 없습니다. 델리게이트는 실행이 끝나면 다시 돌아올 것입니다. 즉, 델리게이트가 처음 실행 되었더라도 델리게이트가 매우 늦게 돌아 오면 아주 늦게 돌아올 것입니다. –

+1

@Hans Jon Senchyna의 대답에 대한 내 의견을 참조하십시오. 이것은 Delegate.BeginInvoke에 대해 올바르지 만 Control.BeginInvoke에는 적합하지 않습니다. – Tergiver

답변

0

같은 기능을 여러 번 호출하면 동일한 순서로 다시 돌아올 것입니다. 1TB 데이터 집합을 분석하는 기능이 있고 다른 기능이 일부 로깅을 수행하는 경우 동일한 순서로 다시 돌아올 것이라고 생각하지 않습니다. 또한 BeginInvoke에 대해 설정 한 DispatcherPriority에 따라 다릅니다. SystemIdl과 같은 낮은 우선 순위는 실행 후 나중에 Send과 같은 높은 우선 순위로 실행됩니다.

1

Control.BeginInvoke()은 UI 스레드에서 비동기 적으로 동작을 실행합니다.

다른 작업으로 BeginInvoke() 번을 여러 번 호출하면 가장 빠른 순서대로 돌아갑니다.

부수적으로, listBox1.Items.Add(count) 번의 호출에서 아마도 SynchRoot 속성을 잠그는 것과 같은 일종의 잠김 메커니즘을 사용해야합니다. MSDN - ListBox.ObjectCollection Class

에서

이 유형의 멤버 (Visual Basic의 경우 Shared) 모든 공용 static 스레드로부터 안전합니다. 인스턴스 멤버는 스레드 안전하지 않을 수 있습니다. 당신이 전화 후 임의의 시간에 비동기 적으로 발생하는 다음 스레드 기능의 실행을 Thread.Start()를 사용하여 스레드를 시작하면

+0

내 대답을 더 잘할 수 있도록 아래쪽 투표를 설명하는 마음? –

0

을 (강조 추가). 그래서 제 생각에는 임의의 숫자를 얻습니다.