2016-05-23 4 views
0

私はC#ソケットサーバーを作成していますが、すでに動作していますが、 "開始"を押すとアプリケーションの "デザイン"は読み込まれません。デザインはデバッグには表示されません

ソケットサーバーが正しく動作しています(出力ウィンドウで動作しています)、エラーは表示されません。私は、コードの一部を削除開始、およびデザインは、この行の後に表示されて停止します。

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()"関数を実行しようとしていますが、機能しません。

フォームがフルロードされた後にソケットサーバーを起動するにはどうすればよいですか?

+0

完了コードを表示してください – auburg

+0

完了しました。 –

答えて

0

server.AcceptTcpClient()はブロック呼び出しであり、UIスレッド上で作成しています。あなたはいくつかの選択肢を持っています。

asyncから呼び出す関数を作成し、​​を使用します。

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

} 

あなたはので、あなたは、コールバックではなく、クライアントを受け入れる持って使用BeginAcceptTcpClientをターゲットにしている.NETのバージョンの非同期/のawaitを使用できない場合。

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で動作します。 –

関連する問題