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

10-11 02:14
查看更多