我有一个超级基本的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}");
// }
//}
}