繁体   English   中英

Control.BeginInvoke执行顺序

[英]Control.BeginInvoke Execution Order

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

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

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

如果您以不同的动作多次调用BeginInvoke() ,则它们将以完成最快的顺序返回。

附带说明一下,您可能应该在listBox1.Items.Add(count)调用周围使用某种同步机制,也许要锁定其SynchRoot属性。

MSDN-ListBox.ObjectCollection类

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

(已强调)

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

如果使用Thread.Start()启动线程,则在调用后的随机时间异步执行线程功能。 这就是为什么我认为您会得到随机数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM