-2

ここで立ち往生しています.....ホストし、すべてのクライアントが登録するチャットサーバーWindowsアプリケーションを作成しています

チャットサーバーを起動するときのシナリオを説明させてください.....登録されているすべてのクライアントIPアドレスを取得しようとするテキストボックス名ChatTextBoxを使用しました

しかし、クライアントをサーバーに登録しようとすると、クロススレッド操作が無効であることが示されます。どうすれば解決できますか????

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);
        }
        }
    }




    }
4

1 に答える 1

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));
    }
}
于 2013-03-07T12:54:26.330 に答える