1

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

1 回答 1

1

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

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

之后,如果BitmapImage保存对流的另一个引用,则流将不会在“长时间”内被释放。

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

于 2013-10-01T23:34:33.277 回答