WPF BitmapImage 图片资源正在被另一个进程使用

做WPF项目时遇到不同进程读取同一个路径的图片,提示图片资源正在被另一个进程使用。

string path="c:\\1.png";

BitmapImage bp = new BitmapImage(new Uri(path, UriKind.Relative));

这时候不同进程用bp是会报错,异常的根本原因是因为BitmapImage没有Dispose()。

上网查,找到方法http://www.cnblogs.com/leco/archive/2011/02/21/1959781.html,

北平 Leco‘s blog

使用流来读图片

/// <summary>
        /// 解决不同进程读取同一张图片的问题
        /// </summary>
        /// <param name="filePath"></param>
        /// <returns></returns>
        private BitmapImage InitImage(string filePath)
        {
            BitmapImage bitmapImage;
            using (BinaryReader reader = new BinaryReader(File.Open(filePath, FileMode.Open)))
            {
                FileInfo fi = new FileInfo(filePath);
                byte[] bytes = reader.ReadBytes((int)fi.Length);
                reader.Close();

                //image = new Image();
                bitmapImage = new BitmapImage();
                bitmapImage.BeginInit();
                bitmapImage.StreamSource = new MemoryStream(bytes);
                bitmapImage.EndInit();
                bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
                //image.Source = bitmapImage;
                reader.Dispose();
            }
            return bitmapImage;
        }

  调用:

string path="c:\\1.png";
BitmapImage bp = InitImage(path);

  

WPF BitmapImage 图片资源正在被另一个进程使用,布布扣,bubuko.com

时间: 2024-10-04 10:13:19

WPF BitmapImage 图片资源正在被另一个进程使用的相关文章

WPF BitmapImage 占用资源无法释放、无法删除问题

原文:WPF BitmapImage 占用资源无法释放.无法删除问题 使用Image控件显示图片后,虽然自己释放了图片资源,Image.Source =null 了一下,但是图片实际没有释放.解决方案:修改加载方式~        public static BitmapImage GetImage(string imagePath)        {            BitmapImage bitmap = new BitmapImage();            if (File.E

实现同一个脚本多次运行,系统中只有一个进程

编写脚本,实现同一个脚本多次运行,系统中只有一个进程 [email protected] scripts]#cat pid.sh #!/bin/sh pidpath=/tmp/a.pid if [ -f "$pidpath" ]   then     kill `cat $pidpath` >/dev/null 2>&1     rm -f $pidpath fi echo $$ >$pidpath sleep 300 测试如下 [email protecte

windows 一个进程可以允许最大的线程数

默认情况下,一个线程的栈要预留1M的内存空间 而一个进程中可用的内存空间只有2G,所以理论上一个进程中最多可以开2048个线程 但是内存当然不可能完全拿来作线程的栈,所以实际数目要比这个值要小. 你也可以通过连接时修改默认栈大小,将其改的比较小,这样就可以多开一些线程. 如将默认栈的大小改成512K,这样理论上最多就可以开4096个线程. 即使物理内存再大,一个进程中可以起的线程总要受到2GB这个内存空间的限制. 比方说你的机器装了64GB物理内存,但每个进程的内存空间还是4GB,其中用户态可用

一个进程的诞生与死亡

执行一个程序,必然就产生一个进程.最直接的程序执行方式就是在shell中以鼠标双击某一个可执行文件图标,执行起来的App进程起始是shell调用CreateProcess激活的. 1.shell调用CreateProcess激活App.exe 2.产生一个进程核心对象,计数值为1 3.系统为此进程建立一个4GB地址空间 4.加载器将必要的代码加载到上述地址空间中,包括App.exe的程序.数据,以及所需要的动态链接函数库DLL.加载器如何知道要加载那些DLLs呢?它们被记录在可执行文件PE文件的

创建一个进程并调用(.net)

最近有一个项目需求,需要调用一个exe,就上网查询了一下,顺利的完成了工作,感觉虽然简单,但挺有意思,就记录一下. 一,创建一个进程 1,代码视图(控制台程序) 2,代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Diagnostics; namespace KillProcess { class Program { static void

设置IE8 多个Table只产生一个进程

//设置IE8 多个Table只产生一个进程 using Microsoft.Win32; RegistryKey key = Registry.LocalMachine; RegistryKey software = key.OpenSubKey("Software\\Microsoft\\Internet Explorer\\Main", true); //该项必须已存在 software.SetValue("TabProcGrowth", "0&qu

如何在 Linux 中统计一个进程的线程数

编译自:http://ask.xmodulo.com/number-of-threads-process-linux.html作者: Dan Nanni原创:LCTT https://linux.cn/article-6240-1.html译者: strugglingyouth本文地址:https://linux.cn/article-6240-1.html 2015-9-17 10:29    收藏: 5 问题: 我正在运行一个程序,它在运行时会派生出多个线程.我想知道程序在运行时会有多少线程

在程序中使用命令打开一个进程和记录该进程执行日志

//在需要的程序中调用ExcutedCmd函数来打开执行dos命令 //cmd 命令  args 命令参数 private static void ExcutedCmd(string cmd, string args) { using (Process p = new Process()) { ProcessStartInfo psi = new ProcessStartInfo(cmd, args); psi.CreateNoWindow = true; psi.UseShellExecute

[WPF 如何] 如何向 ComboBox 添加一个空白选项

原文:[WPF 如何] 如何向 ComboBox 添加一个空白选项 看到这个问题,你可能会蔑视一笑 : 这也能成文章? 确实,你只需要在 ItemsSource 的0位置上插入一个空白的项就是了,如: 1 this.Accounts = rep.All.OrderBy(a => a.Account).Select(a => a.Account).ToList(); 2 this.Accounts.Insert(0, ""); 1 <ComboBox Grid.Colu