在异步任务仍在使用时释放流
本文关键字:释放 异步 任务 | 更新日期: 2024-10-20 21:50:58
我有一个相当大的stream
(代表一个图像(。我有两个任务要做:
- 我想使用异步方法将流上传到云(我假设该方法由
Task.Run
支持( - 上传流时,我需要在本地读取流(以便从图像中创建缩略图(。
我的问题是:由于同一个流对象由两个不同异步任务中的两个指针引用,我应该在哪里释放流?是否可以检测引用流的指针数?或者至少我可以在释放流之前检测流是否正在使用(甚至被另一个线程使用(?
我不知道这两个任务中的哪一个先完成。
如果你的实现是线程安全的,并且你确实需要从多个地方使用一次性的,你可以使用ReactiveExtensions(Rx(的RefCountDisposable 。例如:
RefCountDisposable refDisposable = new RefCountDisposable(stream);
IDisposable ref1 = refDisposable.GetDisposable();
IDisposable ref2 = refDisposable.GetDisposable();
当ref1
和ref2
都被处置时stream
将被处置。
1(如果它由Task.Run
支持,那就是上传者的可怕实现。确实有异步方法来执行 IO 调用,库应该使用它。
2(Stream
线程不安全,您不能让两个线程同时接触同一个流。您需要做的是打开两个流到同一个文件,同时将FileShare.Read
传递给构造函数,一个用于缩略图,一个用于上传。现在,两组进程都可以在完成自己的流时释放自己的流。