c# - 长时间运行的进程卡住 UI,如何使用线程更新?

标签 c# multithreading winforms

我已经为长时间运行的进程编写了此示例代码,但 Windows 窗体会卡住,直到该进程完成。如何更改代码以使工作并行运行?

var ui = TaskScheduler.FromCurrentSynchronizationContext();
Task t = Task.Factory.StartNew(delegate
{
    textBox1.Text = "Enter Thread";
    for (int i = 0; i < 20; i++)
    {
        //My Long Running Work
    }
    textBox1.Text = textBox1.Text + Environment.NewLine + "After Loop";
}, CancellationToken.None, TaskCreationOptions.None, ui);

最佳答案

您可以使用延续。我不记得确切的语法,但它是这样的:

textBox1.Text = "Enter Thread"; //assuming here we're on the UI thread
Task t = Task.Factory.StartNew(delegate
{                
    for (int i = 0; i < 20; i++)
    {
        //My Long Running Work
    }
    return result;
})
.ContinueWith(ret => textBox1.Text = textBox1.Text + Environment.NewLine + result, 
    TaskScheduler.FromCurrentSynchronizationContext());

另一种方法是这样的:

Task t = Task.Factory.StartNew(delegate
{
    YourForm.Invoke((Action)(() => textBox1.Text = "Enter Thread");
    for (int i = 0; i < 20; i++)
    {
        //My Long Running Work
    }
    YourForm.Invoke((Action)(() => textBox1.Text = textBox1.Text + Environment.NewLine + result);}, 
        CancellationToken.None, TaskCreationOptions.None);

同样,我不记得确切的语法,但我的想法是你想在一个不同于 UI 线程的线程上执行长操作,但报告进度(包括完成)界面线程。

顺便说一句,BackGroundWorker class 在这里也能很好地工作(我个人非常喜欢)。

关于c# - 长时间运行的进程卡住 UI,如何使用线程更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4526713/

相关文章:

c# - 扩展可滚动控件的用户控件 - 禁用容器功能

winforms - FlowLayoutPanel AutoSize 高度不起作用

c# - 在 ASP.NET MVC3 中如何查看请求?

java - 在这个代码示例中,Java 中的重入使我们免于陷入死锁情况。如何,为什么?

c# - 如何将 List<> 绑定(bind)到 ListView 中的列

java - JRuby 和 Swing 事件调度线程

c# - 写入具有多个流的文件 C#

c# - 在 C# 中概括和聚合 XML 转储的最佳方法是什么?

c# - 如何获取当前/默认数据库(MongoDB、官方 C# 驱动程序)?

c# - 使用反射获取二级属性值