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个回答

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

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

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

你怎么调用的dispose,贴出你的代码。目测是你文件没有关闭,打开文件遇到文件锁定异常。

stringNewName
木艮氵 回复caozhy: 不要在意路径BQTemp和Temp的问题,是我贴代码贴错了,一个来自服务端一个来自客户端,不过基本的流程就是这样。。。
4 年多之前 回复
stringNewName
木艮氵 已贴。。。代码质量不高见笑了
4 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问