【问题标题】:Calling delegate method blocks my C# app [duplicate]调用委托方法会阻止我的 C# 应用程序 [重复]
【发布时间】:2016-02-16 00:47:52
【问题描述】:

我编写了一个计数程序,该程序的值在标签的文本中表示。 该过程通过单击按钮开始。 当我开始时,用户界面冻结。 我想通过委托解决它。 我的错误在哪里?

代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication6
{

    public delegate void MyDelegate();
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public void DelegateMethod()
        {


            for (int i = 0; i < 9999999999999; i++)
            {
                label1.Text = i.ToString();

            }
            MessageBox.Show("OK");

        }

        private void button1_Click(object sender, EventArgs e)
        {
            BeginInvoke(new MyDelegate(DelegateMethod));
        }
    }
}

【问题讨论】:

    标签: c# delegates


    【解决方案1】:

    这是因为您的 UI 元素更新如此频繁,并且它会一直持续到循环终止,如果您在每次迭代后添加 Thread.Sleep(),您会看到不同的行为:

    for (int i = 0; i < 9999999999999; i++)
    {
        label1.Text = i.ToString();
        // for example delay 1 second
        Thread.Sleep(1000);
    
    }
    

    更好的方法是使用c#中引入的asyncawait关键字,这将在后台而不是在UI线程上做额外的工作,目前所有的处理都在你的UI线程上完成,这会导致UI线程被阻塞。但在你的情况下,这不会有什么不同,因为这里的问题是更新 UI 非常快,这会导致它冻结。

    【讨论】:

    • 我不同意 - 在 UI 线程中休眠不会使 UI 响应,asyncawait 都不会将工作推送到后台线程。
    • 是的,在这种情况下没关系,它的循环是问题
    • 如果循环在后台线程上运行并且标签更新由BeginInvoke 编组到 UI 线程,那么睡眠将通过限制后台线程来帮助。在这里,Thread.Sleep 会使事情变得更糟,因为它会停止 UI 线程。
    • 同意,Sleep 的目的是让标签更新的内容在 i 中可见
    【解决方案2】:

    它会阻塞,因为您在与 UI 相同的线程上运行它。此外,对标签的许多更新不会完全执行得很好 - 即使是从另一个线程更新。

    如果您真的想这样做,请创建一个新线程/任务并从那里正确调用 UI 更新。

    【讨论】:

      【解决方案3】:

      因为你是在 UI 线程上做的。试试Task.Run() 而不是BeginInvoke()

      【讨论】:

        猜你喜欢
        • 2013-09-27
        • 1970-01-01
        • 1970-01-01
        • 2010-10-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多