委托解决线程操作控件问题(简单聊天工具)
2009-04-15 21:06
295 查看
using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Windows.Forms;
namespace Server
{
public partial class Server : Form
{
public Server()
{
InitializeComponent();
}
private TcpListener MyTcpListener = null;
private TcpClient MyTcpServer = null;
private NetworkStream MyNetStream = null;
private Thread MainThread = null;
private Thread MyThread = null;
private StreamWriter MyStreamWriter = null;
private StreamReader MyStreamReader = null;
delegate void SetTextCallBack(string Text);
private void btnConnect_Click(object sender, EventArgs e)
{
MainThread = new Thread(new ThreadStart(Listening));
MainThread.Start();
}
private void Listening()
{
MyTcpListener = new TcpListener(IPAddress.Parse(txtIP.Text), int.Parse(txtPort.Text));
MyTcpListener.Start();
MyTcpServer = MyTcpListener.AcceptTcpClient();
MyTcpListener.Stop();
MyNetStream = MyTcpServer.GetStream();
MyStreamReader = new StreamReader(MyNetStream, System.Text.Encoding.Default);
MyStreamWriter = new StreamWriter(MyNetStream, System.Text.Encoding.Default);
MyThread = new Thread(new ThreadStart(Reading));
MyThread.Start();
MessageBox.Show("连接服务器成功");
}
private void SetText(string Text)
{
if (richTextBox1.InvokeRequired) //如果是不同线程调用就返回True
{
SetTextCallBack setText = new SetTextCallBack(SetText);
this.Invoke(setText, Text); //这里调用下次进来richTextBox1.InvokeRequired就为False
}
else
{
richTextBox1.AppendText(Text);
}
}
private void Reading()
{
while (true)
{
for (int i = 0; i < 4; i++)
{
if (i == 1)
{
string youmsg = "/r/n" + MyStreamReader.ReadLine();
SetText(youmsg); //如果直接在这对richTextBox1操作会提示错误(不是由线程创建的控件)
}
else
{
string youmsg = "/r/n" + MyStreamReader.ReadLine();
SetText(youmsg);
}
}
}
}
private void btnSender_Click(object sender, EventArgs e)
{
string mymsg = DateTime.Now.ToString() + "<" + "来自服务器" + ">" + "/r/n" + richTextBox2.Text + "/r/n" + "/r/n";
MyStreamWriter.WriteLine(mymsg);
MyStreamWriter.Flush();
richTextBox2.Clear();
richTextBox1.AppendText(mymsg);
}
}
}
服务器代码
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Windows.Forms;
namespace Server
{
public partial class Server : Form
{
public Server()
{
InitializeComponent();
}
private TcpListener MyTcpListener = null;
private TcpClient MyTcpServer = null;
private NetworkStream MyNetStream = null;
private Thread MainThread = null;
private Thread MyThread = null;
private StreamWriter MyStreamWriter = null;
private StreamReader MyStreamReader = null;
delegate void SetTextCallBack(string Text);
private void btnConnect_Click(object sender, EventArgs e)
{
MainThread = new Thread(new ThreadStart(Listening));
MainThread.Start();
}
private void Listening()
{
MyTcpListener = new TcpListener(IPAddress.Parse(txtIP.Text), int.Parse(txtPort.Text));
MyTcpListener.Start();
MyTcpServer = MyTcpListener.AcceptTcpClient();
MyTcpListener.Stop();
MyNetStream = MyTcpServer.GetStream();
MyStreamReader = new StreamReader(MyNetStream, System.Text.Encoding.Default);
MyStreamWriter = new StreamWriter(MyNetStream, System.Text.Encoding.Default);
MyThread = new Thread(new ThreadStart(Reading));
MyThread.Start();
MessageBox.Show("连接服务器成功");
}
private void SetText(string Text)
{
if (richTextBox1.InvokeRequired) //如果是不同线程调用就返回True
{
SetTextCallBack setText = new SetTextCallBack(SetText);
this.Invoke(setText, Text); //这里调用下次进来richTextBox1.InvokeRequired就为False
}
else
{
richTextBox1.AppendText(Text);
}
}
private void Reading()
{
while (true)
{
for (int i = 0; i < 4; i++)
{
if (i == 1)
{
string youmsg = "/r/n" + MyStreamReader.ReadLine();
SetText(youmsg); //如果直接在这对richTextBox1操作会提示错误(不是由线程创建的控件)
}
else
{
string youmsg = "/r/n" + MyStreamReader.ReadLine();
SetText(youmsg);
}
}
}
}
private void btnSender_Click(object sender, EventArgs e)
{
string mymsg = DateTime.Now.ToString() + "<" + "来自服务器" + ">" + "/r/n" + richTextBox2.Text + "/r/n" + "/r/n";
MyStreamWriter.WriteLine(mymsg);
MyStreamWriter.Flush();
richTextBox2.Clear();
richTextBox1.AppendText(mymsg);
}
}
}
服务器代码
相关文章推荐
- c#非委托方式在子线程里操作UI控件(实际上运算逻辑在子线程,更新还是在主线程,解决了UI界面无响应的问题)
- invoke委托解决“线程间操作无效: 从不是创建控件的线程访问它”的问题
- 【C#】利用委托解决跨线程操作控件产生的问题
- 后台线程与UI线程问题:解决“线程间操作无效: 从不是创建控件xxx的线程访问它”
- 线程间操作无效: 从不是创建控件“...”的线程访问它 问题解决
- Delphi中多线程用Synchronize实现VCL数据同步显示 解决在线程中操作控件出现问题
- 【问题解决】线程间操作无效:从不是创建控件“textBox1”的线程访问它
- 线程调用带有参数的委托(用来解决跨线程调用控件的问题)
- 多线程委托之跨线程问题分析--在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke(解决方法已更新)
- c# 控件文本通用代理委托设置,解决不同线程间设置控件问题
- c#中使用多线程访问winform中控件的若干问题 解决线程间操作无效: 从不是创建控件的线程访问它
- 利用委托解决多线程中“不是此控件创建的线程”的问题
- C# Winform使用线程,委托定时更新界面UI控件,解决界面卡顿问题
- 黑马程序员-解决系统报错“线程间操作无效: 从不是创建控件" txtbox1" 的线程访问它”问题的方法
- 利用委托解决多线程中“不是此控件创建的线程”的问题
- 线程间操作无效: 从不是创建控件“”的线程访问它~~~的解决方法~ 线程间操作无效: 从不是创建控件“Control Name'”的线程访问它问题的解决方案及原理分析
- WinForm解决多线程操作控件问题 线程间操作无效: 从不是创建控件的线程访问它"
- 用委托在listbox中异步显示信息,解决线程间操作无效,从不是创建控件的线程访问它
- 线程间操作无效: 从不是创建控件“...”的线程访问它 问题解决
- C#中跨线程访问控件问题解决方案