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();



        }

 

posted @ 2021-05-11 14:24  txwtech  阅读(211)  评论(0编辑  收藏  举报