2012-06-08 190 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的回答的評論。這對於Control.BeginInvoke來說是不正確的,但它對於Delegate.BeginInvoke是正確的。 – Tergiver

回答

0

如果您多次調用相同的函數,那麼他們應該以相同的順序返回,也許!如果你有一個函數分析一個1TB數據集,而另一個函數只是做一些記錄,那麼我認爲他們不會以相同的順序返回。 這也取決於您爲BeginInvoke設置的DispatcherPriority。像SystemIdl這樣的低優先級將在後面執行,然後執行更高的優先級,如Send

1

Control.BeginInvoke()將異步執行操作,但在UI線程上。

如果您用不同的動作多次呼叫BeginInvoke(),它們會以最快的順序返回。作爲一個側面說明,你可能應該在你的listBox1.Items.Add(count)調用周圍使用某種snychronization機制,或許鎖定它的SynchRoot屬性。

MSDN - ListBox.ObjectCollection Class

任何公共靜態此類型的成員(在Visual Basic中的Shared)是 線程安全的。任何實例成員不保證是線程 安全

(強調)

+0

介意解釋倒票,所以我可以讓我的答案更好? –

0

如果你開始使用Thread.Start()那麼線程功能的執行的線程在那個電話之後的隨機時間異步進行的。 這就是爲什麼你在我看來隨機數。