Disposing an IRandomAccessStream


是否可以

安全地假设当第一个then子句结束时,bitmapStream将被释放,因为它在这一点上超出了范围(从而使它的引用计数变为 0)?

BitmapImage^ bmp = ref new BitmapImage();
create_task(StorageFile::GetFileFromApplicationUriAsync(uri)).then([](StorageFile^ file)
{
    return file->OpenReadAsync();
}).then([bmp](IRandomAccessStream^ bitmapStream)
{
    return bmp->SetSourceAsync(bitmapStream);
}).then([bmp]()
{
    // Do some stuff with bmp here
});

不是真的,StorageFile::OpenReadAsync()返回一个异步操作IAsyncOperation<IRandomAccessStreamWithContentType>^

此操作创建并保存对IRandomAccessStream的引用,当操作完成后,PPL 任务通过IAsyncOperation<TResult>::GetResults()获取对此流的引用并且它们至少在第二个 lambda 函数完成之前保留引用(第二个 then() 中的 lambda 函数)。

之后,如果BitmapImage持有对流的另一个引用,则流将不会在"长时间"内被释放。

如果要

更深入地了解本主题,可以创建自己的接口实现IRandomAccessStream并在 Dispose 方法中放置断点。

相关内容

  • 没有找到相关文章

最新更新