Я не могу понять, почему моя форма победы зависает, когда начинается бесконечное время. Как я могу это исправить? когда нет времени, кажется, работает. Я пытался делать это с событиями, но без вызовов, но я получаю "доступ из потока, отличного от потока, в котором он был создан". Я понятия не имею, что еще можно попробовать, потому что я пытаюсь отделить интерфейс от логики.
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;
}
}
}