我有一个实现了IDisposable
的对象PreloadClient
,我想要对其进行处理,但是在异步方法完成调用之后却没有发生处理...
private void Preload(SlideHandler slide)
{
using(PreloadClient client = new PreloadClient())
{
client.PreloadCompleted += client_PreloadCompleted;
client.Preload(slide);
}
// Here client is disposed immediately
}
private void client_PreloadCompleted(object sender, SlidePreloadCompletedEventArgs e)
{
// this is method is called after a while,
// but errors are thrown when trying to access object state (fields, properties)
}
那么,有什么想法或解决方法吗?
IsDisposed
属性,让_activeClients
持有客户端列表中WeakReference
的一个列表,并在将项目添加到_activeClients
时检查几个项,以查看是否已死亡的WeakReference
或目标已释放,如果是,则“交换”下一项。这将避免在异步回调中需要锁定列表,并且还会用 O(1)的额外成本代替从列表中删除每个项目的 O(N)成本。 - supercatusing
,即单个子句。这意味着对象将在using
块结束时被释放。在这种情况下,OP调用了一个异步的Preload
方法,所以他希望在所有异步工作完成之前延迟释放。 - vgru