【问题标题】:In WinForms.NET, how to properly update the UI in response to a background Task在 WinForms.NET 中,如何正确更新 UI 以响应后台任务
【发布时间】:2013-04-05 13:30:07
【问题描述】:

我使用以下代码

var UiScheduler = TaskScheduler.FromCurrentSynchronizationContext();
CancellationToken cancellationToken = cancellationTokenSource.Token;
const TaskContinuationOptions continuationOptions = TaskContinuationOptions.OnlyOnRanToCompletion;

Task<string> task = Task<string>.Factory.StartNew(() => getSomeText(), cancellationToken);
task.ContinueWith(t => label.Text = t, cancellationToken, continuationOptions, UiScheduler);

在一些后台任务之后更新 UI。但是,如果在任务完成之前关闭了表单,那么无论如何都会完成更新。是否有一些最佳实践来避免这种情况?当表单已经消失时,一些控件开始出现错误以响应使用它们。我现在检查“Disposing”和“IsDisposed”以避免这种情况,但我不确定这是否是正确的方法以及是否可能存在其他线程问题/竞争条件。感谢您的帮助!

【问题讨论】:

    标签: .net winforms task background-thread


    【解决方案1】:

    在更新 UI 之前检查 UI 线程上的Form.IsDisposed 是可行的方法,并且可以避免任何竞争条件。

    如果您按照 John Willemse 的建议处理 FormClosing 事件,您将能够请求取消任务 - 但仍可能存在竞争条件,这意味着任务将完成并更新 UI。

    【讨论】:

      【解决方案2】:

      您可以处理FormClosing 事件来拦截表单的关闭。 FormClosingEventArgs 包含有关表单关闭原因的信息,例如用户请求、系统关闭等。然后您可以通过取消任务或关闭表单来响应。

      【讨论】:

        猜你喜欢
        • 2013-10-08
        • 2015-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多