win7 C# winForm编程 savefiledialog 不能弹出保存窗体

public void ResMsg()

{

while (isRecMsg)

{

//准备一个数组 准备接收 服务端发来的数据

byte[] msgRec = new byte[1024 * 1024 * 2];

//接收服务端发来的数据,此方法也会阻断当前线程,并返回接收的数据的长度

int recLength = sokClient.Receive(msgRec);

switch(msgRec[0])

{

case 1://接收到 文件

DialogResult reuslt = new SaveFileDialog().ShowDialog(); --- 此处有问题

if (reuslt == System.Windows.Forms.DialogResult.OK)

{

using (FileStream fs = new FileStream(saveFileDialog1.FileName, FileMode.Create))

{

fs.Write(msgRec, 1, recLength - 1);

}

ShowMsg("文件保存完毕!" + saveFileDialog1.FileName);

}

break;

case 2://接收到 字符串消息

{

//将数据转成字符串(要转换的数组,开始转换的下标,要转换的数据长度)

string strRec = System.Text.Encoding.Default.GetString(msgRec, 1, recLength-1);

//将接收到的数据显示在文本框中

ShowMsg(strRec);

break;

}

case 3://接收到 闪屏命令

{

ShakeWindow();

break;

}

}

}

}

客户端和服务器传输文件时, 服务器端都显示发送成功了,但是到客户端保存时,savefiledialog 保存对话框就是弹不来???

仔细的检查代码好几遍,逻辑上没有错误。就是弹不出来,很无语了。就上网查了,查了很多资料,没有什么头绪。在查的过程中,我看见这样的一句话“你前面都说了,你使用线程调用,那么这个线程是否为主线程?如果不是主线程,那么你应该把它交给主线程去处理”,然后我就用一个例子模拟了一下,确实有关系。

模拟的例子:

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

private void button1_Click(object sender, EventArgs e)

{

Thread t = new Thread(saveDialog);

t.IsBackground = true;

//t.ApartmentState = ApartmentState.STA;//缺少这句话,就会出错误。

    //不过以上这句在Vs 2010中显示是被微软否决的,过时的,虽然还能用。但是为了更好的兼容版本,微软推出以下方法:

    t.SetApartmentState(ApartmentState.STA);  //即是在线程启动时设置它的单元状态,这里设置它的状态为单线程单元

t.Start();

}

public void saveDialog()

{

SaveFileDialog result = new SaveFileDialog();

result.ShowDialog();

}

}

模拟的例子:缺少这句话【t.ApartmentState = ApartmentState.STA】,就会出错误。但在vs2010中设置方式变为t.SetApartmentState(ApartmentState.STA);//即是在线程启动时设置它的单元状态,这里设置它的状态为单线程单元

同理 savefiledialog 保存对话框就是弹不来???是不是也是这个问题啊?经过尝试后,还真是这的问题。

就这么简简单单的一句话,就花费了我两个多小时,但最后解决了,也很高兴,并且在找的过程中收获了不少。这就是有失必有得吧!加油!!!

本文转载至http://daociyiyou111.blog.163.com/blog/static/164701512201182104248626/

但经由本人做了些微修改。