我正在创建一个C#套接字服务器,它已经可以工作了,但是现在,当我按下“开始”时,应用程序的“设计”没有加载,它就不可见了。
套接字服务器运行正常(我看到它在输出窗口中工作),我没有看到任何类型的错误。我开始删除部分代码,设计在此行后停止显示:
Text
如果我从此行删除到最后,它会再次出现。
发生了什么事? (抱歉我的英语不好)
TcpClient client = server.AcceptTcpClient();
...
我认为问题是当套接字正在等待连接时负载被中断。
我正在尝试在Form1_Shown上执行“start()”函数,但它不起作用。
如何在Form满载后启动套接字服务器?
答案 0 :(得分:0)
server.AcceptTcpClient()
是一个阻止调用,你是在UI线程上进行的。你有几个选择,这里按照我要做的顺序。
从异步中调用您正在调用的函数并使用AcceptTcpClientAsync。
//Event handlers like `Load` are the only place you are allowed to do "async void"
private async void Form1_Load(object sender, EventArgs e)
{
await start();
}
private async Task start() {
TcpListener server = new TcpListener(IPAddress.Parse("127.0.0.1"), 1234);
server.Start();
TcpClient client = await server.AcceptTcpClientAsync();
Console.WriteLine("Client connected.");
}
如果您不能使用async / await,因为您要定位的.NET版本使用BeginAcceptTcpClient让回调接受客户端。
private void Form1_Load(object sender, EventArgs e)
{
start();
}
private void start() {
TcpListener server = new TcpListener(IPAddress.Parse("127.0.0.1"), 1234);
server.Start();
server.BeginAcceptTcpClient(AcceptClient, server);
}
private void AcceptClient(IAsyncResult result)
{
var server = (TcpListener)result.AsyncState;
TcpClient client = server.EndAcceptTcpClient(result);
Console.WriteLine("Client connected.");
}
或者另一个选项是通过Task.Run(
或类似方式将您当前拥有的代码放在后台线程中。但是,我真的不推荐这种方法,你只需要等待一个新的连接就可以绑定一个线程,框架已经提供了更好的方法来通过使用async / await或begin / end对来没有线程。
private void Form1_Load(object sender, EventArgs e)
{
Task.Run(() => start());
}
private void start() {
TcpListener server = new TcpListener(IPAddress.Parse("127.0.0.1"), 1234);
server.Start();
TcpClient client = server.AcceptTcpClient();
Console.WriteLine("Client connected.");
}