代码之家  ›  专栏  ›  技术社区  ›  Alaa Masalmeh

C#Win形成用户控制后台任务执行延迟

  •  1
  • Alaa Masalmeh  · 技术社区  · 6 年前

    我有一个C#Windows窗体应用程序,它由窗体和用户控件组成。

    我尝试在添加到表单的用户控件内的后台线程中运行代码,以下是我在用户控件内使用的代码:

    private void button3_Click(object sender, EventArgs e)
    {
        ShowNotification("Invoke", $"Start Invoke { DateTime.Now}");
        Task.Run(() =>
        {
            ShowNotification("Run", $"Start Run { DateTime.Now}");
        });
    }
    
    private void ShowNotification(string title, string message, ToolTipIcon icon = ToolTipIcon.Info)
    {
        notifyIcon1.ShowBalloonTip(20, title, message, icon);
    }
    

    在发布模式下运行此项目时,执行没有问题。但是,在调试模式下运行此项目时,任务中的代码将被删除。按下按钮1.5分钟后执行Run,这意味着在第一次通知1.5分钟后显示第二次通知。

    有人知道为什么会这样吗?

    编辑:

    在对这个问题进行了更多搜索之后,我发现了这个问题,它有助于解决这个问题:

    Why can't I start a thread within a user control constructor?

    替换:

    Task.Run(() =>
        {
            ShowNotification("Run", $"Start Run { DateTime.Now}");
        });
    

    与:

     var notificationThread =
                    new Thread(() =>
                    {
                        ShowNotification("Run", $"Start Run {DateTime.Now}");
                    })
                    { IsBackground = true};
    
                notificationThread.Start();
    

    我们已经解决了这个问题。

    1 回复  |  直到 6 年前
        1
  •  0
  •   L_J    6 年前

    尝试调用线程。

    private void ShowNotification(string title, string message, ToolTipIcon icon = ToolTipIcon.Info)
    {
        MethodInvoker Invoker = new MethodInvoker(delegate
        {
            notifyIcon1.ShowBalloonTip(20, title, message, icon);
        });
    
        if (InvokeRequired)
        {
            this.Invoke(Invoker);
        }
        else
        {
            notifyIcon1.ShowBalloonTip(20, title, message, icon);
        }      
    }