2016-05-23 50 views
0

我正在創建一個C#套接字服務器,它已經工作,但現在,當我按下「開始」應用程序的「設計」不會加載,它不可見。設計不會出現在調試

套接字服務器正在運行correcty(我看到它在輸出窗口中工作),我沒有看到任何類型的錯誤。我開始刪除部分代碼,並且設計在此行後停止可見:

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()」函數,但它不起作用。

如何確保在Form完全加載後啓動套接字服務器?

+0

請顯示您的完整代碼 – auburg

+0

完成,我剛剛編輯。 –

回答

0

server.AcceptTcpClient()是一個阻止調用,你正在UI線程上。你有幾個選擇,在這裏他們按照我會做的順序。

使您從異步調用它的功能並使用​​。

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

} 

如果您不能使用異步/ AWAIT的,因爲你的目標使用BeginAcceptTcpClient有回調接受客戶,而不是.NET的版本。

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

} 
+0

太棒了!非常感謝Scott,它適用於BeginAcceptTcpClient。 –