多线程

mingcsharp 2010-02-02 07:13:54
using System;
using System.IO;
using System.Net;
using System.Text;
using System.Threading;
using System.Net.Sockets;
using System.Windows.Forms;

namespace WinTcpServer1
{
public partial class Form1 : Form
{
private TcpClient clent;
private NetworkStream ns;
public Form1()
{
InitializeComponent();
}

private void SendMsg()
{
IPAddress ip = IPAddress.Parse("127.0.0.1");
TcpListener lis = new TcpListener(ip, 777);
lis.Start();
clent = lis.AcceptTcpClient();
ns = clent.GetStream();
byte[] outbytes = Encoding.GetEncoding("gb2312").GetBytes(richTextBox2.Text.Trim());
ns.Write(outbytes, 0, outbytes.Length);
ns.Close();
clent.Close();
lis.Stop();
}
private void ReceviMsg()
{
byte[] inbytes = new byte[1024];
clent = new TcpClient("127.0.0.1", 777);
ns = clent.GetStream();
ns.Read(inbytes, 0, inbytes.Length);
richTextBox1.Text = Encoding.GetEncoding("gb2312").GetString(inbytes);
ns.Close();
clent.Close();
}
private void SendMsg_Click(object sender, EventArgs e)
{
Thread thd = new Thread(new ThreadStart(SendMsg));
thd.Priority = ThreadPriority.Normal;
thd.Start();
}

private void RecviMsg_Click(object sender, EventArgs e)
{
try
{
Thread tha = new Thread(new ThreadStart(ReceviMsg));
tha.Priority = ThreadPriority.Normal;
tha.Start();
}
catch (Exception ep)
{
MessageBox.Show(ep.Message);
}
}
}
}
...全文
117 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
liaoyukun111 2010-02-03
  • 打赏
  • 举报
回复
mark
l376278721 2010-02-02
  • 打赏
  • 举报
回复
微软为了防止线程死锁,所有使用方法2,但是还不不能避免线程死锁的问题
在你用线程来实时接收消息并且显示在控件上的时候,线程访问控件需要一个委托来实现
//委托
delegate void ShowMsgCallback(string msg);
//委托调用的函数
private void ShowMsg(string msg)
{
if (this.rtxtReceive.InvokeRequired)
{
ShowMsgCallback showMsgCallback= new ShowMsgCallback(ShowMsg);
this.Invoke(showMsgCallback, new object[] { msg });
}
else
{
this.rtxtReceive.AppendText(msg + "\r\n");
}
}
线程中的方法调用ShowMsg()方法就可以了
l376278721 2010-02-02
  • 打赏
  • 举报
回复
方法1:
在窗体的Load()方法或者构造函数中加入
Control.CheckForIllegalCrossThreadCalls = false;
方法2:微软推荐方法
private void receiveMsg()
{
while (true)
{
NetworkStream sns = new NetworkStream(sockClt);
byte[] data = new byte[64];
sns.Read(data, 0, data.Length);
string recv = System.Text.Encoding.BigEndianUnicode.GetString(data);
ShowMsg(recv);
}
}
///////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////
/// <summary>
/// 委托
/// </summary>
/// <param name="msg"></param>
delegate void appendText(string msg);
/// <summary>
/// 显示消息方法
/// </summary>
/// <param name="msg"></param>
private void ShowMsg(string msg)
{
if (this.rtxtReceive.InvokeRequired)
{
appendText addpend = new appendText(ShowMsg);
this.Invoke(addpend, new object[] { msg });
}
else
{
this.rtxtReceive.AppendText(msg + "\r\n");
}
}
mingcsharp 2010-02-02
  • 打赏
  • 举报
回复
byte[] outbytes = Encoding.GetEncoding("gb2312").GetBytes(richTextBox2.Text.Trim());
这句有没有错呀,
顺便问一下,多线程中调用的函数不能带参数对不对?
starj1 2010-02-02
  • 打赏
  • 举报
回复
        private void ReceviMsg() 
{
//...
}

这句会出错:
richTextBox1.Text = Encoding.GetEncoding("gb2312").GetString(inbytes); 

从不是创建该控件的线程访问。
要避免错误有二种方法:1.使用委托;2.在定义richTextBox1的语句前加volatile关键字。

111,119

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧