设计不会出现在Debug上

时间:2016-05-23 15:01:33

标签: c# winforms sockets tcpclient

我正在创建一个C#套接字服务器,它已经可以工作了,但是现在,当我按下“开始”时,应用程序的“设计”没有加载,它就不可见了。

套接字服务器运行正常(我看到它在输出窗口中工作),我没有看到任何类型的错误。我开始删除部分代码,设计在此行后停止显示:

Text

如果我从此行删除到最后,它会再次出现。

发生了什么事? (抱歉我的英语不好)

TcpClient client = server.AcceptTcpClient();
...

我认为问题是当套接字正在等待连接时负载被中断。

我正在尝试在Form1_Shown上执行“start()”函数,但它不起作用。

如何在Form满载后启动套接字服务器?

1 个答案:

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

}