C#Winforms-在没有块UI的循环中从另一个类更新表单标签

时间:2019-06-23 20:57:52

标签: c# multithreading winforms user-interface task

我有一个超级基本的winforms应用程序,上面有一个按钮和一个标签,我的所有“业务逻辑”都包含在完全独立的类中。我要实现的是从我的班级获得一个for循环,该循环循环10000次,每次迭代时,我都希望更新表单上的标签以显示该迭代的当前值。

我已经阅读了很多有关此问题的文章,最后我发现可以进行某种操作的 UI未被阻止并且我的标签正在按预期更新,但是运行缓慢。我将为此项目使用异步任务。我需要了解为什么此标签更新会出现这样的延迟,并可能为此找到更快的解决方案

这是基本形式

 public partial class frmMain : Telerik.WinControls.UI.RadForm
{

    public frmMain()
    {
        InitializeComponent();
    }

    private async void btnTest_Click(object sender, EventArgs e)
    {
        await new MyUITestClass(this).test();
    }

    public void UpdateStausText(string text)
    {
        lblStatus.Invoke((MethodInvoker)(() => lblStatus.Text = text));
    }
}

这里是进行计算的类,需要更新表单上的标签。在该类中,有3种方法几乎相同,最后两种已被注释掉。这种未注释的方法可以满足我的需要,但是大约需要30秒才能完成。

另外两个功能大约在3秒钟内完成,但是标签不会在每次迭代中更新,并且UI会被阻塞。

 public class MyUITestClass
{
    private frmMain _targetFrom;

    public MyUITestClass(frmMain targetForm)
    {
        _targetFrom = targetForm;
    }

    // this does what i need it to, but takes about 30 seconds to run.
    public async Task test()
    {
        var counter = 100000;
        List<Task> tasks = new List<Task>();

        for (int i = 0; i < counter; i++)
        {
            await Task.Run(() => _targetFrom.UpdateStausText($"Counter Value : {i}"));
            //tasks.Add(Task.Run(() => _targetFrom.UpdateStausText($"Counter Value : {i}")));
        }

       // await Task.WhenAll(tasks);
    }

    // this only updates the label once everything is completed and blocks my UI
    //public async Task test()
    //{
    //    var counter = 100000;
    //    List<Task> tasks = new List<Task>();

    //    for (int i = 0; i < counter; i++)
    //    {
    //        Task.Run(() => _targetFrom.UpdateStausText($"Counter Value : {i}"));

    //    }
    //}

    // this only updates the label once everything is completed and blocks my UI
    //public async Task test()
    //{
    //    var counter = 100000;
    //    List<Task> tasks = new List<Task>();

    //    for (int i = 0; i < counter; i++)
    //    {
    //        _targetFrom.UpdateStausText($"Counter Value : {i}");
    //    }
    //}
}

0 个答案:

没有答案
相关问题