gpt4 book ai didi

c# - 如何在长时间运行的功能期间更新 UI(文本字段)?

转载 作者:行者123 更新时间:2023-11-30 13:38:23 24 4
gpt4 key购买 nike

我知道这个问题可能没有意义,而且我很难想出一种方法来解释它,所以我将展示一段代码来提供帮助。我在 visual studio express 2010 上使用 Winforms:

private void button1(object sender, EventArgs e)
{
txtOutput.Text += "Auto-collecting variables. This may take several minutes";
string v = foo();
txtOutput.Text += "\n" + v;
string b = bar();
txtOutput.Text += "\n" + b;

txtOutput.SelectionStart = txtOutput.Text.Length;
txtOutput.ScrollToCaret(); //scrolls to the bottom of textbox
}

所以基本上,当用户单击 button1 时,我希望在文本框中显示“自动收集变量...”,然后让 foo() 执行、显示它,然后让 bar() 执行,然后然后显示它。

目前发生的事情是 foo() 和 bar() 执行,然后在 foo() 和 bar() 执行后所有内容立即显示(需要几分钟的功能)。无论如何都可以解决这个问题,或者有解决办法吗?

编辑:C# 版本为 4.0。如果我更新到 4.5 或 5.0,没有 .NET 4.5/5.0 的计算机是否可以运行 .exe?

最佳答案

C# 5.0 使这项工作变得微不足道。

使用 Task.Run 在后台线程中执行长时间运行的任务,并使用 await 在 UI 线程中继续执行该方法的其余部分,而不会阻塞异步任务期间的 UI 线程。

private async void button1(object sender, EventArgs e)
{
txtOutput.Text += "Auto-collecting variables. This may take several minutes";
string v = await Task.Run(() => foo());
txtOutput.Text += "\n" + v;
string b = await Task.Run(() => bar());
txtOutput.Text += "\n" + b;

txtOutput.SelectionStart = txtOutput.Text.Length;
txtOutput.ScrollToCaret(); //scrolls to the bottom of textbox
}

您可以像这样在 C# 4.0 中执行相同的操作:(第一个解决方案将由编译器转换为类似的东西。)

private  void button1(object sender, EventArgs e)
{
txtOutput.Text += "Auto-collecting variables. This may take several minutes";
Task.Factory.StartNew(() => foo())
.ContinueWith(t => txtOutput.Text += "\n" + t.Result
, TaskScheduler.FromCurrentSynchronizationContext())
.ContinueWith(t => bar())
.ContinueWith(t =>
{
txtOutput.Text += "\n" + t.Result;
txtOutput.SelectionStart = txtOutput.Text.Length;
txtOutput.ScrollToCaret(); //scrolls to the bottom of textbox
}
, TaskScheduler.FromCurrentSynchronizationContext());
}

关于c# - 如何在长时间运行的功能期间更新 UI(文本字段)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17069489/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com