设计不会出现在调试中
Design don't appear on Debug
我正在创建一个 C# 套接字服务器,它已经可以工作了,但是现在,当我按下 "Start" 时,应用程序的 "design" 没有加载,它不可见。
套接字服务器 运行 正确(我看到它在输出 window 中工作),我没有看到任何类型的错误。我开始删除部分代码,此行后设计不再可见:
TcpClient client = server.AcceptTcpClient();
...
如果我从这一行删除到最后,它会再次出现。
这是怎么回事? (抱歉我的英语不好)
public Form1()
{
InitializeComponent();
}
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();
TcpClient client = server.AcceptTcpClient();
Console.WriteLine("Client connected.");
}
我认为问题在于套接字正在等待连接时负载中断。
我正在尝试在 Form1_Shown 上执行 "start()" 功能,但它不起作用。
如何确保在表单加载完成后启动套接字服务器?
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.");
}
如果由于您所针对的 .NET 版本而无法使用 async/await,请使用 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.");
}
我正在创建一个 C# 套接字服务器,它已经可以工作了,但是现在,当我按下 "Start" 时,应用程序的 "design" 没有加载,它不可见。
套接字服务器 运行 正确(我看到它在输出 window 中工作),我没有看到任何类型的错误。我开始删除部分代码,此行后设计不再可见:
TcpClient client = server.AcceptTcpClient();
...
如果我从这一行删除到最后,它会再次出现。
这是怎么回事? (抱歉我的英语不好)
public Form1()
{
InitializeComponent();
}
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();
TcpClient client = server.AcceptTcpClient();
Console.WriteLine("Client connected.");
}
我认为问题在于套接字正在等待连接时负载中断。
我正在尝试在 Form1_Shown 上执行 "start()" 功能,但它不起作用。
如何确保在表单加载完成后启动套接字服务器?
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.");
}
如果由于您所针对的 .NET 版本而无法使用 async/await,请使用 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.");
}