处理IRandomaccesstream

处理IRandomaccesstream,stream,windows-runtime,c++-cx,Stream,Windows Runtime,C++ Cx,可以安全地假设当第一个then子句完成时,bitmapStream将被释放,因为它在该点超出范围(从而使其ref count变为0) 不完全是这样,StorageFile::OpenReadAsync()返回一个IAsyncOperation^,这是一个异步操作 此操作创建并保存对irandomaccesstream的引用,操作完成后,PPL任务通过 并且它们保持引用,至少直到第二个lambda函数完成为止(第二个then()中的lambda函数) 在此之后,如果BitmapImage保存了对流

可以安全地假设当第一个
then
子句完成时,
bitmapStream
将被释放,因为它在该点超出范围(从而使其ref count变为0)


不完全是这样,
StorageFile::OpenReadAsync()
返回一个
IAsyncOperation^
,这是一个异步操作

此操作创建并保存对
irandomaccesstream
的引用,操作完成后,PPL任务通过 并且它们保持引用,至少直到第二个lambda函数完成为止(第二个
then()
中的lambda函数)

在此之后,如果
BitmapImage
保存了对流的另一个引用,那么流在“很长”时间内不会被释放


如果您想深入了解此主题,您可以创建自己的
irandomaccesstream
接口实现,并在Dispose方法中设置断点。

不太可能,
StorageFile::OpenReadAsync()
返回一个
IAsyncOperation^
,这是一个异步操作

此操作创建并保存对
irandomaccesstream
的引用,操作完成后,PPL任务通过 并且它们保持引用,至少直到第二个lambda函数完成为止(第二个
then()
中的lambda函数)

在此之后,如果
BitmapImage
保存了对流的另一个引用,那么流在“很长”时间内不会被释放

如果您想深入了解此主题,可以创建自己的
irandomaccesstream
接口实现,并在Dispose方法中设置断点

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
});