打开后表格破裂

问题描述 投票:2回答:1

我不明白为什么无限长的开始时我的获胜表格会挂起。我怎样才能解决这个问题?当似乎没有任何工作时。我曾尝试通过事件进行操作,但是没有调用,但是我“从不同于创建它的线程访问”。我不知道我还能尝试什么,因为我试图将UI与逻辑分离。

 public GroupChatForm(string username)
        {
            gchat = new GroupChat(username);
            InitializeComponent();
        }

        private void GroupChat_Load(object sender, EventArgs e)
        {
            listMessage.Text = gchat.Start();
            Thread ctThread = new Thread(postMessage);
            ctThread.Start();
        }
        private void postMessage()
        {
            while (true)
            {
                if (this.InvokeRequired)
                    this.Invoke(new Action(postMessage));
                else //listMessage.BeginInvoke(new Action(() => listMessage.Text = listMessage.Text + gchat.getMessage()));
                    listMessage.Text = listMessage.Text + gchat.getMessage();
            }
        }
using System;
using System.Net.Sockets;

namespace StudentForYouGroupChat
{

    public class GroupChat
    {
        TcpClient clientSocket = new TcpClient();
        NetworkStream serverStream = default(NetworkStream);
        string readData = null;
        string message;
        string username;

        public GroupChat(string username)
        {
            this.username = username;
        }
        public string Start()
        {
            readData = "Conected to Chat Server ...";
            clientSocket.Connect("127.0.0.1", 8888);
            serverStream = clientSocket.GetStream();

            byte[] outStream = System.Text.Encoding.ASCII.GetBytes(username + "$");
            serverStream.Write(outStream, 0, outStream.Length);
            serverStream.Flush();
            /*Thread ctThread = new Thread(getMessage);
            ctThread.Start();*/
            return msg();
        }
        public void Send(string msg)
        {
            byte[] outStream = System.Text.Encoding.ASCII.GetBytes(msg + "$");
            serverStream.Write(outStream, 0, outStream.Length);
            serverStream.Flush();
        }
        public string getMessage()
        {
            serverStream = clientSocket.GetStream();
            var buffSize = 0;
            byte[] inStream = new byte[clientSocket.ReceiveBufferSize];
            buffSize = clientSocket.ReceiveBufferSize;
            serverStream.Read(inStream, 0, buffSize);
            var returnData = System.Text.Encoding.ASCII.GetString(inStream);
            readData = "" + returnData;
            return msg();
        }
        //Laikinai pasalinsime ir uzdesime be if'o

        public string msg() 
        {
            /*if (this.InvokeRequired)
                this.Invoke(new MethodInvoker(msg));
            return "error";*/
            //else
            return Environment.NewLine + " >> " + readData;
        }
    }
}
c# multithreading winforms
1个回答
-1
投票

@@ Idle_Mind我仍然可以从除它在其上创建的线程”错误,应如何调用以使其仍然工作?

不确定您尝试过什么...这里是我在说的“简化”版本:

public class GroupChatForm : Form
{

    public void foo()
    {
        GroupChat gc = new GroupChat();
        gc.MessageReceived += Gc_MessageReceived; // wire up the event
        gc.Start();
    }

    private void Gc_MessageReceived(string message)
    {
        if (this.InvokeRequired)
        {
            this.Invoke(new MethodInvoker(delegate
            {
                Gc_MessageReceived(message); // recursive call that will become UI safe on the second call
            }));
        }
        else
        {

            // ... it's safe to update your GUI in here with "message" ...

        }
    }

}

public class GroupChat
{

    public delegate void dlgMessage(String message);
    public event dlgMessage MessageReceived;

    public void Start()
    {
        // setup your TCP stuff
        // start a new thread that has MessageLoop() below in it
    }

    public void MessageLoop() // ... running in a new THREAD ...
    {
        String message;
        bool newMessageReceived = false;
        while (true)
        {

            // ... blocking code that receives a message ...

            message = "some message from the stream";
            newMessageReceived = true;

            if (newMessageReceived)
            {
                // raise the event w/ the message
                MessageReceived?.Invoke(message);
                newMessageReceived = false;
            }
        }

    }

}
© www.soinside.com 2019 - 2024. All rights reserved.