1
public class MyTask : IDisposable { ... }

MyTask task = new MyTask(() => SomeTask);

task.Completed += (s, e) =>
{
    // do something with result
    ...
    // dispose of this instance
    ((MyTask)s).Dispose();
};

// execute the task
task.Execute();

显然,我无法确定任务何时完成,因此在我看来,我可以处理此实例的唯一实际位置是在 Completed 事件中。

这样做安全吗?

4

1 回答 1

0

唉,关于什么时候打电话是安全的,没有一般规则Dispose。如果 Microsoft 已指定Dispose必须在对象不使用时随时安全调用,那么遵守这样的规则将很少有困难;如果一个类可能并不总是能够立即执行所有必要的清理(*),它通常可以设置一个标志和/或以其他方式安排在下一次机会执行必要的清理。不幸的是,Microsoft 没有指定Dispose实现必须处理异步Dispose请求,也没有任何通用方法可以让持有对IDisposable实例的最后有用引用的对象在可以安全处置时请求通知。

尽管普遍缺乏关于何时可以安全调用 Dispose 的保证,但许多实现的特定类Dispose确实提供了关于何时可以安全调用它的保证。如果知道某个特定对象是一种可以在特定上下文中安全处置的类型,那么就可以处置它。特别是在来自对象的事件可能是它可以知道的线程上下文中的唯一机会Dispose的情况下,并且在事件处理程序中处置对象是有意义的,处置对象应该是安全的。任何正确编写的事件处理程序都应该为发送事件的对象可能在系统决定它们应该运行的时间和它实际运行它们的时间之间处置的可能性做好准备。

(*) 的基本目的IDisposable是允许一个对象通知在它之外但代表它行事而损害其他实体的实体,他们不应该再这样做[例如告诉文件系统它不应该不再授予对象对文件的独占访问]。这种行为被称为“释放资源”。某人持有对象的最后一个幸存引用这一事实可能意味着没有其他线程可以使用该对象,但并不意味着没有其他线程正在使用任何需要释放资源的非线程安全实体。

于 2013-04-05T15:13:10.100 回答