1

我使用以下代码

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”以避免这种情况,但我不确定这是否是正确的方法以及是否可能存在其他线程问题/竞争条件。感谢您的帮助!

4

2 回答 2

0

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

于 2013-04-05T13:39:17.980 回答
0

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

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

于 2013-04-05T13:45:56.923 回答