设计不会出现在调试中

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.");

}