【问题标题】:How to solve cross Thread Operation not valid in windows form? [duplicate]如何解决跨线程操作在 windows 窗体中无效? [复制]
【发布时间】:2013-03-07 21:20:40
【问题描述】:

我一直卡在这里.....我正在创建一个聊天服务器 Windows 应用程序,它将托管并且所有客户端都将注册

让我解释一下我的场景,当我启动聊天服务器时.....我使用了 TextBox 名称 ChatTextBox,我尝试在其中获取所有注册的客户端 IP 地址

但是当我尝试在服务器上注册一个客户端时,它显示跨线程操作无效,如何解决它????

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Windows.Forms;
using System.Threading;

namespace Myservercheck
{
public partial class Form2 : Form
{
    TcpListener myli;
    TcpClient clientSocket = default(TcpClient);
    string s=string.Empty;

    public Form2(TcpListener tc)
    {
        myli = tc;
        InitializeComponent();

    }

    private void Form2_Load(object sender, EventArgs e)
    {
        IPlistBox.Items.Add(myli.LocalEndpoint.ToString());
        chattextBox.Text= "Chat server started on selected IP & Port Number:\n"+myli.LocalEndpoint.ToString();
        chattextBox.AppendText("\n");
        chattextBox.AppendText("Waiting for connections............\n");
        myli.Start();
       Thread thread1 = new Thread(listern);
       thread1.Start();
        chattextBox.AppendText("\n");


    }


    public void listern()
    {
        while (true)
        {

            clientSocket = myli.AcceptTcpClient();
            IPAddress tempAddress = ((IPEndPoint)(clientSocket.Client.RemoteEndPoint)).Address;
            chattextBox.Text = tempAddress.ToString();
            chattextBox.AppendText("Connection accepted from:" + s);
        }
        }
    }




    }

【问题讨论】:

  • 在谷歌中输入“WinForms跨线程操作”即可解决,仅在本站就能找到很多答案。
  • 我是新手,我已经看到它是使用委托和使用 Invoke 我不知道如何完成的??我无法解释...为什么它使用委托和调用来完成
  • 同样的问题已经在这里被问过很多次了。请参阅本页右侧的相关列。

标签: c# asp.net .net ado.net tcpclient


【解决方案1】:

您需要调用表单控件上的方法来委托给表单的线程。您只能从创建表单的同一线程访问表单控件。

public void listern() {
    while (true) {
        clientSocket = myli.AcceptTcpClient;
        IPAddress tempAddress = ((IPEndPoint)(clientSocket.Client.RemoteEndPoint)).Address;
        UpdateChattextBox(tempAddress.ToString, "Connection accepted from:" + s);     
    }
}

public void UpdateChattextBox(string address, string message) {
    if ((chattextBox.InvokeRequired == true)) {
        this.invoke(UpdateCattextBox, address, message);
    }
    else {
        chattextBox.Text = tempAddress.ToString;
        chattextBox.AppendText(("Connection accepted from:" + s));
    }
}

【讨论】:

  • “只能从创建...的同一线程访问表单控件” 是正确的,但非常无用。
猜你喜欢
  • 2012-12-06
  • 1970-01-01
  • 2013-08-16
  • 1970-01-01
  • 1970-01-01
  • 2012-02-09
  • 2012-08-22
  • 1970-01-01
相关资源
最近更新 更多