我知道这个问题可能没有意义,我很难想出一种方法来解释它,所以我将展示一段代码来提供帮助。我在 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/