0

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);
    }

そして、整数のリストは順不同で戻ってきます。

4

3 に答える 3

1

Control.BeginInvoke()アクションは非同期に実行されますが、UI スレッドで実行されます。

異なるアクションで複数回呼び出した場合はBeginInvoke()、最も早く完了したものから順に返されます。

補足として、おそらくそのプロパティlistBox1.Items.Add(count)をロックして、呼び出しの周りにある種の同期メカニズムを使用する必要があります。SynchRoot

MSDNから- ListBox.ObjectCollection クラス

この型の public static (Visual Basic では共有) メンバーはすべて、スレッド セーフです。どのインスタンス メンバーも、スレッド セーフであるとは限りません

(強調を追加)

于 2012-06-08T18:21:40.943 に答える
0

同じ関数を複数回呼び出すと、おそらく同じ順序で返されるはずです! 1 TB のデータセットを分析する関数と、ログを記録するだけの別の関数がある場合、それらが同じ順序で返されるとは思いません。また、BeginInvoke に設定したDispatcherPriorityにも依存します。のような優先度の低いものSystemIdlは、優先度の高いものよりも後に実行されますSend

于 2012-06-08T16:42:45.377 に答える