【发布时间】:2016-04-19 09:57:53
【问题描述】:
我是编程新手,只是想知道我遇到的问题的解决方案是否合适。
我想将一个状态(字符串)从一个正在创建 Socket 的类中写入一个文本框,并且该类侦听要接收的数据(在另一个线程中)。
这就是我所做的:
通过单击按钮在 Form.cs 中创建类:
private void button_Create_Click(object sender, EventArgs e)
{
int port;
Int32.TryParse(textBox_Port.Text, out port);
ServerSocketClass serverSocket = new ServerSocketClass(port, this);
}
ServerSocketClass 看起来像:
class ServerSocketClass
{
Socket ServerSocket;
Socket Accepted;
IPEndPoint LocalEndpoint;
int Port = 1337; // just for fun
Messenger MainForm;
public ServerSocketClass(int port, Messenger form)
{
MainForm = form;
if (port != 0)
Port = port;
ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
LocalEndpoint = new IPEndPoint(IPAddress.Any, Port);
MainForm.writeToMessages("Binding Endpoint to Socket...");
ServerSocket.Bind(LocalEndpoint);
MainForm.writeToMessages("Starting ServerListener Thread...");
Thread ServerListenThread = new Thread(startListening);
ServerListenThread.Name = "ServerListenerThread";
ServerListenThread.Start();
}
private void startListening()
{
ServerSocket.Listen(5);
MainForm.writeToMessages("Whaiting for incoming connections...");
Accepted = ServerSocket.Accept();
whaitForData();
}
为了更新表单类中的 GUI,我创建了一个委托和一个带有调用的“更新”方法:
public delegate void writeMessege(string message);
public writeMessege MessegeDelegate;
public void writeToMesseges(string messege)
{
if (InvokeRequired)
{
this.Invoke(MessegeDelegate, new object[] { messege });
return;
}
textBox_Messeges.AppendText("SYSTEM: " + messege + "\n");
}
它有效,但我想知道这是否是一种“有效”的方式,或者我是否应该去开发者地狱;-)
提前致谢
洛克
【问题讨论】:
-
为什么不使用异步方法?您将如何处理多个客户?
-
一个接一个 ;-) 只是想知道这种方式是否可以从其他类/线程更新 UI。
-
不,这不是因为有更好的方法,比如使用 async/await。同样对于套接字,最好使用异步方法,例如 BeginAccept。
-
不幸的是 Socket 没有任何基于任务的方法,但你可以用
Task.FromAsyn方法包装Begin/End方法
标签: c# multithreading class user-interface