c# - 表格打开后崩溃

标签 c# multithreading winforms

我不明白为什么我的 win Form 在 infinite while 开始时挂起。我怎样才能解决这个问题?当没有它似乎工作的时候。我试过用事件来做,但没有调用,但我“从创建它的线程以外的线程访问”。我不知道我还能尝试什么,因为我正在尝试将 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;
        }
    }
}

最佳答案

@Idle_Mind I still get the "accessed from a thread other than the thread it was created on" Error, how should invoke so it would still work?

不确定您尝试了什么...这是我所说内容的“简化”版本:

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

    }

}

关于c# - 表格打开后崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58492916/

相关文章:

c# - TFS 获取具有关系和子项的项目

c# - 结果与空 LINQ 查询的联合

c++ - 使用线程c++执行shell命令

c# - 在 Windows 窗体用户控件中嵌入 XNA 游戏

c# - 父窗体的移动事件

c# - 从内部网络中的另一台机器访问 Docker 容器

c# - 使用 Windows Phone 8 模拟蓝牙键盘

Java:在原始线程的上下文中从另一个线程调用回调

c - 如何在OMP编译指示中声明数组

c# - .net Winforms 中的保存图像问题