> 馆藏中心

C# 用来接收消息的Socket在结束后,接收消息的线程是否会停止并被回收

来源:cnblogs 编辑:王强

1 事件C#中通过事件来完成交互www.179s.com防采集请勿采集本网。

结束了,while结束线程就结束了。

测试看楼上。

第二段客户端在发送消息前并没有连接服务器,需要先 Connect

socketSend.Receive这个方法,网络异常的时候会抛异常的,异常之后可以处理/清理下相关资源。收获园豆:5

展开全部 在cmd里使用osql --1、备份 osql -E -Q"BACKUP DATABASE test to disk='c:\\aa\\aaa.bak'" 2、还原 osql -E -Q"RESTORE DATABASE test from disk

============================================

56行的位置已经得到了接收的数据, 在这里使用控件的Invoke方法进行操作就行了

卧槽,我没脑子了,我把资源释放写finally里了。我老觉得哪里不对劲

用Socket+多线程就可以实现接收消息和发送消息。

============================================

56行的位置已经得到了接收的数据, 在这里使用控件的Invoke方法进行操作就行了

Socket是不是调用Close()方法就会自己释放掉?Thread.CurrentThread.ManagedThreadId

状态信息是tcpclient,传递到了IAsyncResult ar,通过 (TcpClient)ar.AsyncState得到状态信息tcpclient。前提是要在异步执行完毕才执行回调函数RequestCallback,并把状态信息传

这个可以获取当前线程Id,但是不好判断线程有没有被回收,

建议在发送每一条指定时这样发送: 前4个字节定义为本次指令串的byte数组长度,后面跟着发送指令串的byte数组。 读指令时先读取前4个字节,得出后面指令串的长度,然后读出

因为都是由线程池控制的,即使线程ID不一样也不能判断他就被回收了

//BeginReceive UdpClient client; bool messageReceived = false; public void Main() { client = new UdpClient(8080); client.BeginReceive(ReceiveCallback, "flag&qu

因为有可能是其他的闲置线程过来处理,上一个线程处理其他的逻辑去了收获园豆:5会结束,在vs2012控制台中,Receive方法会抛出异常,紧接着有打印线程0x什么已退出

一种是短连接.接收者启用listen(),发送者connect()后send()然后close 一种是长连接,所有消息的发送和接收者都连接到一个指定的地方。然后可以用广播的方式发送。每个连接

目前,网上关于C#进程间通信的方法有很多种,但是总结起来它们不外乎从以下两个方面进行考虑:一、在两个进程之间建立一个共同区域,其中一个进程改变这个区域的内容,而另一个进程则去读取它,反之亦 然。比如,可以让两个进程共享同一块内存,通过改变和读取内存中的内容进行通信;或者,创建一个文件,两个进程同时占用,甚至可以利用注册表或者剪贴板充当这个“共同区域”。二、利用API函数去找到进程窗口的句柄,然后用API去控制这个窗口。例如,导入“User32.dll”中的FindWindow、FindWindowEx函数查找窗口,并获取窗口句柄,也可直接利用C#中的Process类来启动程序,并获取这个进程的主窗口的句柄,等等。在编程时,我们往往需要选择一种即方便编写,效率又高的程序。第一种类型相对比较复杂,而且效率不高,相比来讲,第二种类型在不降低程序运行效率的情况下编写更简单。下面我就以一个示例程序来讲解如何使用Process类和API实现两个进程之间的传输数据。第一步:(1)打开VS2008,新建一个“windows 应用程序”,主窗口为Form1(2)在Form1上添加一个标签label1,并为Form1添加KeyDown事件,当Form1接收到KewDown消息时,将接收到的数据显示在label1上。 public Form1() { InitializeComponent(); ////////////////////添加KeyDown事件/////////////////// KeyDown+=new KeyEventHandler(Form1_KeyDown); } /////////////////具体实现///////////////////////////// private void Form1_KeyDown(object sender, KeyEventArgs e) { this.label1.Text = Convert.ToString(e.KeyValue); }(3)编译运行,生成Form1.exe第二步:(1)打开VS2008,新建一个“windows 应用程序”,主窗口为Form2,并在Form2上添加三个按钮和一个文本 框,分别为button1,button2,button3,textbox1(2)在Form2.cs中添加引用: using System.Diagnostics; using System.Runtime.InteropServices; 并导入Win32 API函数: [DllImport("User32.dll", EntryPoint = "SendMessage")] private static extern int SendMessage(IntPtr wnd,int msg,IntPtr wP,IntPtr lP);(3)在Form2类中定义以下两个变量 ProcessStartInfo psInfo = new ProcessStartInfo(@"..\..\..\Form1\bin\Debug\Form1.exe"); Process pro = new Process();(4)为Form2添加Load事件响应 private void Form1_Load(object sender, EventArgs e) { pro.StartInfo = psInfo ; }(5)为button1,button2,button3分别添加click事件响应,并添加响应内容: Button1: pro.Start(); 点击该按钮,启动Form1.exe程序 Button2: pro.Kill(); 点击该按钮,退出From1.exe程序 Button3: IntPtr hWnd = pro.MainWindowHandle; //获取Form1.exe主窗口句柄 int data = Convert.ToInt32(this.textBox1.Text); //获取文本框数据 SendMessage(hWnd, 0x0100, (IntPtr)data, (IntPtr)0); //发送WM_KEYDOWN消息 点击该按钮,以文本框数据为参数,向Form1发送WM_KEYDOWN消息(6)编译运行,生成Form2.exe第三步: 将Form1文件夹拷贝到与Form2同一目录下,启动Form2.exe: 点击button1按钮,则Form1.exe启动 点击button2按钮,则Form1.exe退出 在Form1.exe程序正在运行的情况下,在Form2窗口的文本框中输入任意数字并点击button3按钮,Form1窗口的label1即显示该数字。 以上只是简单的介绍了利用C#的Process类和Win32 API函数实现进程之间的数据传输,读者可以根据实际情况举一反三,编写功能更加强大的程序。转自http://blog.sina.com.cn/s/blog_873a233e0100vop4.html,目前,网上关于C#进程间通信的方法有很多种,但是总结起来它们不外乎从以下两个方面进行考虑:一、在两个进程之间建立一个共同区域,其中一个进程改变这个区域的内容,而另一个进程则去读取它,反之亦 然。比如,可以让两个进程共享同一块内存,通过改变和读取内存中的内容进行通信;或者,创建一个文件,两个进程同时占用,甚至可以利用注册表或者剪贴板充当这个“共同区域”。二、利用API函数去找到进程窗口的句柄,然后用API去控制这个窗口。例如,导入“User32.dll”中的FindWindow、FindWindowEx函数查找窗口,并获取窗口句柄,也可直接利用C#中的Process类来启动程序,并获取这个进程的主窗口的句柄,等等。在编程时,我们往往需要选择一种即方便编写,效率又高的程序。第一种类型相对比较复杂,而且效率不高,相比来讲,第二种类型在不降低程序运行效率的情况下编写更简单。下面我就以一个示例程序来讲解如何使用Process类和API实现两个进程之间的传输数据。第一步:(1)打开VS2008,新建一个“windows 应用程序”,主窗口为Form1(2)在Form1上添加一个标签label1,并为Form1添加KeyDown事件,当Form1接收到KewDown消息时,将接收到的数据显示在label1上。 public Form1() { InitializeComponent(); ////////////////////添加KeyDown事件/////////////////// KeyDown+=new KeyEventHandler(Form1_KeyDown); } /////////////////具体实现///////////////////////////// private void Form1_KeyDown(object sender, KeyEventArgs e) { this.label1.Text = Convert.ToString(e.KeyValue); }(3)编译运行,生成Form1.exe第二步:(1)打开VS2008,新建一个“windows 应用程序”,主窗口为Form2,并在Form2上添加三个按钮和一个文本 框,分别为button1,button2,button3,textbox1(2)在Form2.cs中添加引用: using System.Diagnostics; using System.Runtime.InteropServices; 并导入Win32 API函数: [DllImport("User32.dll", EntryPoint = "SendMessage")] private static extern int SendMessage(IntPtr wnd,int msg,IntPtr wP,IntPtr lP);(3)在Form2类中定义以下两个变量 ProcessStartInfo psInfo = new ProcessStartInfo(@"..\..\..\Form1\bin\Debug\Form1.exe"); Process pro = new Process();(4)为Form2添加Load事件响应 private void Form1_Load(object sender, EventArgs e) { pro.StartInfo = psInfo ; }(5)为button1,button2,button3分别添加click事件响应,并添加响应内容: Button1: pro.Start(); 点击该按钮,启动Form1.exe程序 Button2: pro.Kill(); 点击该按钮,退出From1.exe程序 Button3: IntPtr hWnd = pro.MainWindowHandle; //获取Form1.exe主窗口句柄 int data = Convert.ToInt32(this.textBox1.Text); //获取文本框数据 SendMessage(hWnd, 0x0100, (IntPtr)data, (IntPtr)0); //发送WM_KEYDOWN消息 点击该按钮,以文本框数据为参数,向Form1发送WM_KEYDOWN消息(6)编译运行,生成Form2.exe第三步: 将Form1文件夹拷贝到与Form2同一目录下,启动Form2.exe: 点击button1按钮,则Form1.exe启动 点击button2按钮,则Form1.exe退出 在Form1.exe程序正在运行的情况下,在Form2窗口的文本框中输入任意数字并点击button3按钮,Form1窗口的label1即显示该数字。 以上只是简单的介绍了利用C#的Process类和Win32 API函数实现进程之间的数据传输,读者可以根据实际情况举一反三,编写功能更加强大的程序。转自http://blog.sina.com.cn/s/blog_873a233e0100vop4.html内容来自www.179s.com请勿采集。

本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。本文《C# 用来接收消息的Socket在结束后,接收消息的线程是否会停止并被回收》转载自cnblogs,版权归原作者所有,若侵权请联系:E-MAIL:513175919@qq.com
违法违规信息请立即联系本网可获得现金奖励,TEL:1-8-2-1-0-2-3-3-3-8-1(电话仅供违法违规信息举报,侵权类信息请EMAIL。)

www.179s.com false 互联网 http://www.179s.com/jsblogcnk/po/pohdyj.html report 6976 结束了,while结束线程就结束了。测试看楼上。socketSend.Receive这个方法,网络异常的时候会抛异常的,异常之后可以处理/清理下相关资源。收获园豆:5============================================卧槽,我没脑子了,我把资源释放写finally里了。我老觉得哪里不对劲============================================Socket是不是调用Close()方法就会自己释放掉?Thr

热门图片

经济金融企业管理法律法规社会民生科学教育降生活体育运动文化艺术电子数码电脑网络娱乐休闲行政地区心理分析医疗卫生