我知道这个问题可能没有意义,而且我很难想出一种方法来解释它,所以我将展示一段代码来提供帮助。我在 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());
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)