![](/img/trans.png)
[英]Will multiple Control.BeginInvoke/Invoke calls execute in order?
[英]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.