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 类

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

(重点补充)

于 2012-06-08T18:21:40.943 回答
0

如果你多次调用同一个函数,那么它们应该以相同的顺序返回,也许!如果您有一个分析 1 TB 数据集的函数,而另一个函数只是进行一些日志记录,那么我认为它们不会以相同的顺序返回。它还取决于您为 BeginInvoke 设置的DispatcherPriority 。低优先级 likeSystemIdl将稍后执行,然后执行更高优先级 like Send

于 2012-06-08T16:42:45.377 回答
0

如果您使用启动线程Thread.Start(),则线程函数的执行在该调用之后的随机时间异步发生。这就是我认为你得到随机数的原因。

于 2017-07-31T14:13:51.427 回答