处理IRandomAccessStream

时间:2013-10-01 17:49:42

标签: stream windows-runtime c++-cx

假设当第一个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
});

1 个答案:

答案 0 :(得分:1)

实际上,StorageFile::OpenReadAsync()返回IAsyncOperation<IRandomAccessStreamWithContentType>^这是一个异步操作。

此操作创建并保留对IRandomAccessStream的引用,当操作完成时,PPL任务通过IAsyncOperation<TResult>::GetResults()获取对此流的引用 并且他们至少持有引用,直到第二个lambda函数完成(第二个then()中的lambda函数)。

之后,如果BitmapImage拥有对该流的另一个引用,则该流将不会被“处理”很长时间。

如果您想深入研究本主题,您可以创建自己的IRandomAccessStream接口实现,并在Dispose方法中添加断点。