C# socket线程问题

时间:2022-10-03 17:36:41
大家好! 我想请教两个问题:
一个是就是比如我在一个线程中判断对方发来的消息来做事,比如对方返回OK我就开启一个新的窗口,主窗口就隐藏了,就是想问下 为什么子窗口一出来就卡住了界面看不到   我知道肯定是这个窗口是在线程中打开的所以窗口要卡住,我就是想问有什么方法让子窗口启动的时候不卡住
如果我在主程序中调用就不卡,有不有好的解决办法;
二的个:就是关于线程调用控键的问题,  一个线程调用不是自己线程的控键的时候他要包错,
我们可以用falseco什么的一个静态函数设置为false就可以避免了 但我发现这个办法对treeview控键不行,还有中方法就是调用Control.Invu()什么的方法来委托调用 就是这个方法我不会请大家交我下谢谢

6 个解决方案

#1



private static int size = 1024;
        private static string clientReceiveStr = null;
        private static byte[] clientReceiveBytes = new byte[size];
        public delegate void getTXT();
      
        private void Form1_Load(object sender, EventArgs e)
        {    
               ……………………  //各种连接就不写了
               ……………………
            Thread td = new Thread(XX);     //如果不开启线程,Receive()等待接收而不执行下去,就会出现你说的窗口卡住的现象
        }
        public void XX()
        {
            try
            {
                while (true)
                {

                    int n = ClientSocket.Receive(clientReceiveBytes, clientReceiveBytes.Length, 0);
                    clientReceiveStr = Encoding.UTF8.GetString(clientReceiveBytes, 0, n);
                    getTXT get = new getTXT(HH);   //要给textbox1赋值,因为在不同线程,所以要调用委托
                    
                }
            }
            catch 
            {
              
            }
        }
        public void HH()
        {
            textBox1.Text = clientReceiveStr;
        }

#2



 public delegate void FileHandler(Zhzhu.Model.MessageInfo arg);

this.BeginInvoke(new FileHandler(SaveFile), message);//显示保存文件窗体(Control.BeginInvoke())

private void SaveFile(Zhzhu.Model.MessageInfo message)
        {
            FileForm file = new FileForm();
            file.Tag = message;
            file.FileSocket = client_UdpSocket;
            file.Show();
        }

#3


引用楼主 puwusweet 的回复:
这个窗口是在线程中打开的所以窗口要卡住

没这说法吧。。。

可能有两个原因:
1、你是在监听线程下实例化窗体,举例,我循环监听,当获得数据包后还要回到监听状态,因为个时候没有数据包,线程就挂在这里了,你生成窗体的代码运行被延迟;
2、你隐藏主线程的窗体,用到委托,这块可能没有处理好,举例,我委托窗体隐藏,但是主线程正在运行别的东西,子线程等待返回值。

#4


C# socket线程问题
看了第二条问题,才知道,你压根没有用委托,你看看这方面资料吧。。。。

两个问题用委托都可以完美解决

#5


哈哈,看楼上的表情很有意思。。。。


1.楼主在调用子窗体的时候不要再FromLode的时候做监听等操作,可以异步起新线程监听

2.C#认定在线程中操作控件是不安全的行为,禁止操作的,所以要用到委托代理,网上例子很多,看看吧。

#6


看见lz的结贴率就沉默了

#1



private static int size = 1024;
        private static string clientReceiveStr = null;
        private static byte[] clientReceiveBytes = new byte[size];
        public delegate void getTXT();
      
        private void Form1_Load(object sender, EventArgs e)
        {    
               ……………………  //各种连接就不写了
               ……………………
            Thread td = new Thread(XX);     //如果不开启线程,Receive()等待接收而不执行下去,就会出现你说的窗口卡住的现象
        }
        public void XX()
        {
            try
            {
                while (true)
                {

                    int n = ClientSocket.Receive(clientReceiveBytes, clientReceiveBytes.Length, 0);
                    clientReceiveStr = Encoding.UTF8.GetString(clientReceiveBytes, 0, n);
                    getTXT get = new getTXT(HH);   //要给textbox1赋值,因为在不同线程,所以要调用委托
                    
                }
            }
            catch 
            {
              
            }
        }
        public void HH()
        {
            textBox1.Text = clientReceiveStr;
        }

#2



 public delegate void FileHandler(Zhzhu.Model.MessageInfo arg);

this.BeginInvoke(new FileHandler(SaveFile), message);//显示保存文件窗体(Control.BeginInvoke())

private void SaveFile(Zhzhu.Model.MessageInfo message)
        {
            FileForm file = new FileForm();
            file.Tag = message;
            file.FileSocket = client_UdpSocket;
            file.Show();
        }

#3


引用楼主 puwusweet 的回复:
这个窗口是在线程中打开的所以窗口要卡住

没这说法吧。。。

可能有两个原因:
1、你是在监听线程下实例化窗体,举例,我循环监听,当获得数据包后还要回到监听状态,因为个时候没有数据包,线程就挂在这里了,你生成窗体的代码运行被延迟;
2、你隐藏主线程的窗体,用到委托,这块可能没有处理好,举例,我委托窗体隐藏,但是主线程正在运行别的东西,子线程等待返回值。

#4


C# socket线程问题
看了第二条问题,才知道,你压根没有用委托,你看看这方面资料吧。。。。

两个问题用委托都可以完美解决

#5


哈哈,看楼上的表情很有意思。。。。


1.楼主在调用子窗体的时候不要再FromLode的时候做监听等操作,可以异步起新线程监听

2.C#认定在线程中操作控件是不安全的行为,禁止操作的,所以要用到委托代理,网上例子很多,看看吧。

#6


看见lz的结贴率就沉默了