我不明白为什么我的 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/