Control.BeginInvoke执行顺序

时间:2012-06-08 16:31:49

标签: c# begininvoke

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

整数列表将不按顺序返回。

3 个答案:

答案 0 :(得分:1)

Control.BeginInvoke()将异步执行操作,但是在UI线程上。

如果您使用不同的操作多次致电BeginInvoke(),他们将按照最快完成的顺序返回。

作为旁注,您应该在listBox1.Items.Add(count)调用周围使用某种类型的同步机制,可能会锁定其SynchRoot属性。

来自MSDN - ListBox.ObjectCollection Class

  

此类型的任何公共静态(在Visual Basic中为Shared)成员都是   线程安全。任何实例成员都不能保证是线程   安全

(强调补充)

答案 1 :(得分:0)

如果你多次调用同一个函数,那么它们应该以相同的顺序返回,也许!如果你有一个分析1 TB数据集的函数和另一个只做一些Logging的函数,那么我认为它们不会以相同的顺序返回。 它还取决于您为BeginInvoke设置的DispatcherPriority。像SystemIdl这样的低优先级将会执行,然后执行更高的优先级,例如Send

答案 2 :(得分:0)

如果使用Dim dr As OleDbDataReader dr = cmd.ExecuteReader dtt.Load(dr) 启动线程,则线程函数的执行在该调用之后的随机时间异步发生。 这就是我认为你得到随机数的原因。