在WinForms.如何正确更新UI以响应后台任务



我使用以下代码

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。但是,如果在任务完成之前关闭了Form,那么无论如何都会完成更新。是否有一些最佳实践来避免这种情况?当窗体已经消失时,一些控件在使用它们时开始出现Bug。我现在检查"处置"one_answers"isdispose"以避免这种情况,但我不确定这是否是正确的方式,以及是否可能有其他线程问题/竞争条件。谢谢你的帮助!

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

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

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

最新更新