调用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);
}
整数列表将不按顺序返回。
答案 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)
启动线程,则线程函数的执行在该调用之后的随机时间异步发生。
这就是我认为你得到随机数的原因。