c# - Invoke and Delegates in events - 为什么 Action 会以这种(意外的)顺序发生?

标签 c# events delegates invoke begininvoke

我有一个 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,但消息框显示顺序如下:

enter image description here enter image description here enter image description here

... 而不是我期望的 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/

相关文章:

c# - 使用 DateTime 值过滤 DataTable

c# - .NET Core 2从内存流下载Excel文件

c# - 如何在 ASP.NET Core MVC 中启用跨源请求 (CORS)

c# - 如何在 C# 中通过 |= 运算符将负数转换为正数?

Javascript onkeypress 事件触发但输入的文本值不正确

ios - PWA iOS 启动画面上的触发事件

c# - 在 C# 中引发事件的这些可能性之间有什么区别?

c# - 有人可以提炼成正确的英语委托(delegate)是什么吗?

C# Elasticsearch NEST 无法转换 lambda 表达式

c# - 委托(delegate)协方差混淆难题!