我有一个 problem with component events这可以通过使用 delegate
来解决。
我之前没有和委托(delegate)一起工作过,所以我测试了一下,发现了这个奇怪的行为:
When using delegates the actions happen in a for me completely unexpected order.
第一个样本:
string Tracker = "";
private void button1_Click(object sender, EventArgs e)
{
Tracker = "A";
BeginInvoke((MethodInvoker)delegate
{
Tracker += "B";
});
Tracker += "C";
}
在此Tracker
之后包含ACB
。不知道它是如何工作的,但它似乎按照描述工作。
第二个样本:
string Tracker = "";
private void button2_Click(object sender, EventArgs e)
{
Tracker = "A";
MessageBox.Show(Tracker);
BeginInvoke((MethodInvoker)delegate
{
Tracker += "B";
MessageBox.Show(Tracker);
});
Tracker += "C";
MessageBox.Show(Tracker);
}
在此Tracker
之后还包含ACB
,但消息框显示顺序如下:
... 而不是我期望的 A
AC
ACB
。
这是什么解释?
最佳答案
示例 1:
private void button1_Click(object sender, EventArgs e)
{
Tracker = "A";
BeginInvoke((MethodInvoker)delegate
{
Tracker += "B";
});
Tracker += "C";
}
第一个跟踪器已分配, 接下来,您将一个委托(delegate)异步推送到 GUI 队列,因此直到它有机会才会发生。 所以下一个 Tracker 就变成了 AC。 然后 GUI 线程就释放了,因此你得到了 ACB。 示例 2:
string Tracker = "";
private void button2_Click(object sender, EventArgs e)
{
Tracker = "A";
MessageBox.Show(Tracker);
BeginInvoke((MethodInvoker)delegate
{
Tracker += "B";
MessageBox.Show(Tracker);
});
Tracker += "C";
MessageBox.Show(Tracker);
}
同样的事情发生了: 首先会出现 A 的消息框,我认为这是合乎逻辑的。 接下来委托(delegate)被推送到 GUI 线程的队列中 然后 Tracker 变为 AC,消息框被安排在 GUI 线程上运行,并被安排显示 AC。但是,因为在 GUI 线程上安排了其他事情,所以其他事情将首先发生。 所以首先委托(delegate)要执行,然后AC要显示。
如果我的解释在某些时候仍然不清楚,请发表评论,并告诉我哪一部分需要进一步阐述。 但最重要的是,操作被推送到 GUI 线程,并由 GUI 线程按照它们出现在 GUI 线程中的顺序执行。
关于c# - Invoke and Delegates in events - 为什么 Action 会以这种(意外的)顺序发生?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28614664/