木艮氵 2016-01-01 14:48 采纳率: 100%
浏览 1937
已采纳

C#中用filestream新建了一个jpg后dispose,然后用bitmap打不开了

对于其他的jpg我用bitmap可以正常打开
对于我用filestream新建后又写入了数据的jpg(之后用可以在电脑文件管理器中看到并打开查看,是正确的jpg文件),然而随后我调用了dispose,因为我想再用bitmap直接打开这个文件,然而失败了。并没有报错,只是异步调用的函数一致卡在new Bitmap(filepath)这一句上。。。
求解。

在做一个C#的网络文件传输,客户端发给服务器再由服务器发送给所有在线的客户端。

贴代码

 /// <summary>
        /// 收到图片信息
        /// </summary>
        /// <param name="imageMsg">图片消息</param>
        public void ReceiveImageMessage( ImageMessage imageMsg )
        {
            MessageDelegate imageDel = new MessageDelegate(DealImageMessage);
            imageDel.BeginInvoke( imageMsg , null , null );
        }
        private void DealImageMessage( Message msg )
        {//中间一大段可以不用看。文件传输没问题。
            ImageMessage imageMsg = msg as ImageMessage;

            string ip = imageMsg.Ip;
            int port = imageMsg.Port;                                   //获取客户端ip和port
            string filename = string.Format("{0}{1}{2}{3}{4}{5}{6}",DateTime.Now.Year,DateTime.Now.Month,DateTime.Now.Day,DateTime.Now.Hour,DateTime.Now.Minute,DateTime.Now.Second,
                Path.GetExtension(imageMsg.ImageName));
            string username = imageMsg.UserName;

            IPEndPoint end = new IPEndPoint(IPAddress.Parse(ip),port);
            TcpClient imageClient = new TcpClient();
            imageClient.Connect( end );                                  //connect向客户端

            NetworkStream streamToClient = imageClient.GetStream();
            int BufferSize = 1024;
            byte[] buffer = new byte[BufferSize];
            FileStream outputToImage = new FileStream("../BQTemp/"+filename,FileMode.CreateNew,FileAccess.Write);

            int bytesread = 0;
            int totalbytes = 0;
            do
            {
                bytesread = streamToClient.Read( buffer , 0 , BufferSize );
                totalbytes += bytesread;
                outputToImage.Write( buffer , 0 , bytesread );
            } while(bytesread > 0);                                    //读取文件

            streamToClient.Dispose();
            outputToImage.Dispose();
            imageClient.Close();                                        //关闭

            BroadImage( username , filename );                          //广播图片
        }

然后在BroadImage( username , filename );调用了下面这个函数

 /// <summary>
        /// 打印图片
        /// </summary>
        /// <param name="imageMsg"></param>
        public void ShowImage( ImageMessage imageMsg )
        {
            string imageName = imageMsg.ImageName;
            chatBox.AppendText( imageMsg.UserName + ":\n" );
            Clipboard.Clear();
            Bitmap bmp = new Bitmap("../Temp/"+imageName);//嗯没错是这一句卡住了
            Clipboard.SetImage( bmp );
            chatBox.Paste();
            Clipboard.Clear();
            chatBox.AppendText( "\n" );
        }
  • 写回答

2条回答 默认 最新

  • 木艮氵 2016-01-02 12:49
    关注

    唔,是我搞错了。
    最后错误的原因是异步调用卡在了clipboard.clear这一句上

    在多线程里使用clipboard时要保证使用clipboard的线程是STA
    于是另起一个线程执行HelpShowImage函数就可以正常打印图片了

    然而这个方法真的很low......见笑见笑

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 微信夜间被转走了1w对,当天手机剪切板里就出现了这个乱码,有铁子可以看看是啥吗可以
  • ¥50 跑通github上的代码 深度学习 pytorch
  • ¥50 求写,批处理调用分区助手分区脚本
  • ¥15 求购HI3519AV100开发板
  • ¥15 请问1553 RT怎么测试,没有BC有方法吗
  • ¥100 业务编程如何选择学习方向和内容?
  • ¥15 wamp3.3.5安装完成后图标正常显示绿色,鼠标左右键点击图标均无反应。求解决方法。
  • ¥15 鼠标点击的这条记录了什么?
  • ¥15 在写pid调速的程序时,电机始终维持最大速度
  • ¥15 【有偿】调用DXGI截图初始化失败,提示0xf 887a0004