我不明白为什么无限长的开始时我的获胜表格会挂起。我怎样才能解决这个问题?当似乎没有任何工作时。我曾尝试通过事件进行操作,但是没有调用,但是我“从不同于创建它的线程访问”。我不知道我还能尝试什么,因为我试图将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我仍然可以从除它在其上创建的线程”错误,应如何调用以使其仍然工作?
不确定您尝试过什么...这里是我在说的“简化”版本:
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;
}
}
}
}