木艮氵 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条)

报告相同问题?

悬赏问题

  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能