0

我是多线程的新手

我有两个函数我想在不同的线程上运行(如果你必须知道,它们是到不同端口的两个 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)
        {
        }

    }
}
4

1 回答 1

2

可以创建一个线程来执行非静态函数。您的代码的问题在于,在创建实例之前,您的线程实例是一个类字段,正在使用实例变量/方法(ConnectListen)进行初始化。

要解决这个问题,只需在类级别定义变量,然后在构造函数中初始化它们。

Thread lis;
Thread con;

public Form1() {
  InitializeComponent();

  lis = new Thread(Listen);
  con = new Thread(Connect);

  lis.IsBackground = true;
  con.IsBackground = true;
}

另请注意,您无法从其他线程访问 UI 线程拥有的任何控件。您必须Control.BeginInvokeWinForms应用程序中使用。

private void Connect() {
  // ....

  txtCommandToSend.BeginInvoke(new Action(() => {
    txtCommandToSend.Text = "your string";
  }));

  // ....
}

对于你的第二个问题。我不确定您在运行时将数据推送到您的函数是什么意思。线程启动后,您无法将任何数据推送到该函数。但是,您可以在其他线程下执行的函数中使用实例变量。但是,您需要小心,如果这些变量被多个线程访问,则应该对这些变量使用适当的锁定。

于 2013-05-30T04:51:41.237 回答