多线程非静态+输入输出+套接字
本文关键字:输入输出 套接字 静态 多线程 | 更新日期: 2023-09-27 18:16:04
我是多线程新手
我有两个函数,我想在不同的线程上运行(如果你必须知道,它们是两个tcp套接字连接到不同的端口,一个作为服务器,另一个作为客户端)
第一:我如何访问主窗体上的文本框?它不允许我访问非静态成员,并且我不能在非静态函数上创建线程
第二:我怎么能把数据推到函数,而它的运行?
我可能以错误的方式接近这个,无论如何这是我的代码结构(删除几行以简化)
namespace WindowsFormsApplication4
{
public partial class Form1 : Form
{
Thread lis = new Thread(new ThreadStart(Listen));
Thread con = new Thread(new ThreadStart(Connect));
public Form1()
{
InitializeComponent();
lis.IsBackground = true;
con.IsBackground = true;
}
static void Connect()
{
//try to connect to 127.0.0.1:10500
while (true)
{
//listen and output to Form1.txtControlMessages
//input from Form1.txtCommandToSend and write to the stream
}
}
static void Listen()
{
try
{
//start listen server on port 10502
while (true)
{
//accept client and output to Form1.txtData
}
}
catch (SocketException e)
{
}
}
}
可以创建一个线程来执行非静态函数。你的代码的问题是,你的线程实例,这是一个类字段被初始化与实例变量/方法(Connect
和Listen
)之前,可以创建实例。
要解决这个问题,只需在类级别定义变量,然后在构造函数中初始化它们。
Thread lis;
Thread con;
public Form1() {
InitializeComponent();
lis = new Thread(Listen);
con = new Thread(Connect);
lis.IsBackground = true;
con.IsBackground = true;
}
还要注意,你不能从其他线程访问UI线程拥有的任何控件。你必须在WinForms
应用程序中使用Control.BeginInvoke
。
private void Connect() {
// ....
txtCommandToSend.BeginInvoke(new Action(() => {
txtCommandToSend.Text = "your string";
}));
// ....
}
第二个问题。我不确定你的意思是推数据到你的功能,而它的运行。一旦线程启动,就不能将任何数据推入函数。但是,您可以在其他线程下执行的函数中使用实例变量。但是,如果有多个线程访问这些变量,您需要小心,并且应该对这些变量使用适当的锁定。