C# 数据绑定WPF、多页TIFF、内存流和性能

C# 数据绑定WPF、多页TIFF、内存流和性能,c#,.net,wpf,performance,C#,.net,Wpf,Performance,我在WPF控件中有一个数据绑定对象,该对象正在“预览”mutlipage tiff 该对象具有公共PreviewPage和CurrentPreviewPage 它有一个私有的PreviewPages,它是MemoryStream的集合(每个代表Tiff的一页) 获取PreviewImage(第一次)后,此代码将运行: if (PreviewPages.Count == 0) { Image myImg = System.Drawing.Image.FromFile(_LocalFile)

我在WPF控件中有一个数据绑定对象,该对象正在“预览”mutlipage tiff

该对象具有公共PreviewPage和CurrentPreviewPage

它有一个私有的PreviewPages,它是MemoryStream的集合(每个代表Tiff的一页)

获取PreviewImage(第一次)后,此代码将运行:

if (PreviewPages.Count == 0)
{
    Image myImg = System.Drawing.Image.FromFile(_LocalFile);

    for (int i = 0; i < (NumberOfPages); i++)
    {
        myImg.SelectActiveFrame(System.Drawing.Imaging.FrameDimension.Page, i);
        System.IO.MemoryStream ms = new System.IO.MemoryStream();
        myImg.Save(ms, System.Drawing.Imaging.ImageFormat.Tiff);
        PreviewPages.Add(ms);
    }
}

现在,在初始化之后,这段代码工作得非常好(它可以像拖动绑定滑块一样快速地更改页面)。任何帮助都将不胜感激。

在主线程上加载第一页,然后在后台加载其他页面-请参阅BackGroundWorker。只有主线程可以访问UI。在BackGroundWorker上,您需要决定是一次2-x一个页面还是一次全部页面。在将第2页带到UI线程之前,用户无法访问第2页。我会取消。如果用户放弃,您不想占用CPU。

但为什么要加载所有17页?用户在一瞬间只能看到一个页面,不是吗?从第一个线程开始,在seorate线程的队列中按顺序加载它们。例如,Adobe Reader、Google Docs和其他应用程序都会这样做。在主线程上加载第一页,然后在后台加载其他页面-请参阅BackGroundWorker。只有主线程可以访问UI。在BackGroundWorker上,您需要决定是一次2-x一个页面还是一次全部页面。用户在将第2页带到UI线程之前无法访问第2页。这是真的,但第一页仍然存在问题,但这可能是最好的方法。我将查看是否有其他人有其他评论和/或保留。System.Drawing.Image.FromFile(_LocalFile)是否需要很多时间?希望它一次只读取一个。不,似乎保存内存流需要时间。我不知道是否有更好的方法。我将它移动到后台工作程序,它异步加载页面,看起来工作正常。我仍然不明白为什么在100%cpu使用率的情况下,将一个1MB tiff加载到多个MemoryStream需要约10秒。这是一个很好的答案。我仍然会尝试打开文件/内存流的方式,看看是否有更快的方式访问它。我改变了过程的细节,使用图像对象的RawFormat(希望强制它不要转换)和单个MemoryStream对象,影响可以忽略不计。我会让它保持这样,并构建一个更好的界面,向用户显示什么是/没有加载的。谢谢
BitmapImage bi = new BitmapImage();
bi.BeginInit();
bi.DecodePixelWidth = 1000;
//bi.UriSource = new Uri(fiTemp.FullName);
bi.StreamSource = new System.IO.MemoryStream(PreviewPages[CurrentPreviewPage - 1].ToArray());
bi.EndInit();
_PreviewImage = bi;