c# {"Undo 操作遇到的上下文与相应 Set 操作中应用的上下文不同。可是因为在线程上 S
异步套接字接收信息,弹出窗口。接收信息,弹出窗口
{"Undo 操作遇到的上下文与相应 Set 操作中应用的上下文不同。可是因为在线程上 S
原因是由于多线程操作窗口资源的问题,必须托管到创建资源的线程来实现。异步socket实际上就是生成子线程的
环境vs2015 C#是一个form1是用户名密码登陆,通信是用异步socket写的,如果登陆成功则
this.Visible = false;
Form2 form2 = new Form2();
form2.ShowDialog();
此时form2最大化,最小化,或者是
做一些其他操作的时候就会抛出未处理InvalidOperationException,Undo 操作遇到的上下文与相应 Set 操作中应用的上下文不同
,猜想可能与form2是由一个异步socket生成的有关,异步socket实际上就是生成子线程的,所以将
this.Visible = false;
Form2 form2 = new Form2();
form2.ShowDialog();
部分写为委托利用Invoke使其由主线程执行
更改后问题得到解决,原因仍然没有想明白,你也可以试验一下将可疑的操作都交给Invoke操作。
delegate void ShowForm2();
m_ShowForm2 = new ShowForm2(LogigShowform2);
public void LogigShowform2()
{
this.Visible = false;
Form2 form2 = new Form2();
form2.ShowDialog();
}
Invoke(m_ShowForm2);
////------------------
delegate void delegate_ShowReminder();
Form_Material_Arriving_Reminder form_material = new Form_Material_Arriving_Reminder();//Form_Material_Arriving_Reminder 是弹出窗口的form类
public void Showmyneed(object sender, DataEventArgs e) { string words = Encoding.UTF8.GetString(e.Data, e.Offset, e.Length); label1.Text = words; label1.ForeColor = Color.Red; button8.Text = "呼叫"; // LoadReminderWindow(words); tcpClientSession.DataReceived -= Showmyneed; // callOnClick(button_reminder_window); // string words = label1.Text; // form_material.label_MessageText.Text = button5.Text + "\n" + words; // form_material.ShowDialog(); // form_material.Show(); // form_material.Dispose(); delegate_ShowReminder m_ShowForm_reminder = new delegate_ShowReminder(ShowformReminder); Invoke(m_ShowForm_reminder); }
public void ShowformReminder() { // this.Visible = false; Form_Material_Arriving_Reminder form_material = new Form_Material_Arriving_Reminder(); form_material.label_MessageText.Text = button5.Text + "\n" + label1.Text; form_material.ShowDialog(); form_material.Dispose(); }