在异步任务仍在使用时释放流

本文关键字:释放 异步 任务 | 更新日期: 2024-10-20 21:50:58

我有一个相当大的stream(代表一个图像(。我有两个任务要做:

  1. 我想使用异步方法将流上传到云(我假设该方法由Task.Run支持(
  2. 上传流时,我需要在本地读取流(以便从图像中创建缩略图(。

我的问题是:由于同一个流对象由两个不同异步任务中的两个指针引用,我应该在哪里释放流?是否可以检测引用流的指针数?或者至少我可以在释放流之前检测流是否正在使用(甚至被另一个线程使用(?

我不知道这两个任务中的哪一个先完成。

在异步任务仍在使用时释放流

如果你的实现是线程安全的,并且你确实需要从多个地方使用一次性的,你可以使用ReactiveExtensions(Rx(的RefCountDisposable 。例如:

RefCountDisposable refDisposable = new RefCountDisposable(stream);     
IDisposable ref1 = refDisposable.GetDisposable();
IDisposable ref2 = refDisposable.GetDisposable();

ref1ref2都被处置时stream将被处置。

1(如果它由Task.Run支持,那就是上传者的可怕实现。确实有异步方法来执行 IO 调用,库应该使用它。

2(Stream线程不安全,您不能让两个线程同时接触同一个流。您需要做的是打开两个流到同一个文件,同时将FileShare.Read传递给构造函数,一个用于缩略图,一个用于上传。现在,两组进程都可以在完成自己的流时释放自己的流。