日期:2014-05-18 浏览次数:20986 次
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Threading; using System.Net.Sockets; namespace WindowsForms { public partial class Form1 : Form { //我想做一个多人聊天的程序,参考了一下网上的代码。 //首先创建一个监听的线程(主线程),然后监听2012端口。一旦有新连接,创建另外一个处理线程 //处理消息,目前发现一些问题(该程序是服务端的)。 //这两个变量在运行时会提示从不是创建的线程访问,如何让这两个变量线程安全访问?? Thread ListenThread; Thread ServiceThread; Socket ServiceSocket; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { ListenThread = new Thread(new ThreadStart(StartListen)); ListenThread.Start(); } private void StartListen() { TcpListener server = new TcpListener(2012); server.Start(); while (true) { //以下的ServiceSocket和ServiceThread全局变量需要在【标记1】和【标记2】之间不被其他线程更改 //【标记1】 ServiceSocket = server.AcceptSocket(); ServiceThread = new Thread(new ThreadStart(StartService)); ServiceThread.IsBackground = true; ServiceThread.Start(); } } private void StartService() { //这里需要得到全局变量ServiceThread和ServiceSocket,仍然会提示从不是创建的线程访问。 //如果不将变量ServiceThread设为全局,如何才能在函数中得到自己是属于哪个线程?? //如果使用委托,这怎么处理啊。需要把【标记1】和【标记2】之间的语句放入委托函数中,不清楚怎么弄。 Thread thread = ServiceThread; Socket socket = ServiceThread; //【标记2】 Boolean active = true; while(active) { byte[] buffer = new byte[10000000]; socket.Receive(buffer); //一些其他处理过程 } } } }