В следующем коде сообщения от сервера принимаются в одном потоке (внутри while loop
).И сообщения на сервер отправляются в главном потоке графического интерфейса (на sendButton_Click
)
using System.Windows.Forms;
using System.Net.Sockets;
using System.Threading;
namespace SimulatedClient
{
public partial class ClientForm : Form
{
TcpClient clientSocket = new TcpClient();
NetworkStream serverStream = default(NetworkStream);
string readdata = null;
public ClientForm()
{
InitializeComponent();
}
private void connectButton_Click(object sender, EventArgs e)
{
clientSocket.Connect(hostTextbox.Text, Int32.Parse(portTextBox.Text));
Thread ctThread = new Thread(getMessages);
ctThread.Start();
}
public void getMessages()
{
string returnData;
while (true)
{
serverStream = clientSocket.GetStream();
var buffersize = clientSocket.ReceiveBufferSize;
byte[] instream = new byte[buffersize];
serverStream.Read(instream, 0, buffersize);
returnData = System.Text.Encoding.ASCII.GetString(instream);
readdata = returnData;
UpdateReceivedPressureLabelText(readdata);
//msg();
}
}
void UpdateReceivedPressureLabelText(string value)
{
Action action = () => incomingTextBox.Text = value;
this.Invoke(action);
}
//private void msg()
//{
// if (this.InvokeRequired)
// {
// this.Invoke(new MethodInvoker(msg));
// }
// else
// {
// incomingTextBox.Text = readdata;
// }
//}
private void sendButton_Click(object sender, EventArgs e)
{
byte[] outstream = Encoding.ASCII.GetBytes(outgoingTextBox.Text);
serverStream.Write(outstream, 0 , outstream.Length);
serverStream.Flush();
}
}
}

ВОПРОС: Можно ли это сделать, то есть можно ли получать сообщения, используя один поток, и отправлять сообщения в другом потоке для одного и того же clientSocket
?Программа работает, но я не уверен, что это может привести к какой-то проблеме?