2016-07-18 18 views
1

async/awaitを使用して非同期サーバーで非常に単純なクライアントサーバーアプリケーションを作成しようとしています。ソリューションに2つのプロジェクトがあります。async/awaitを使用して非同期サーバーに接続できません

サーバーはコンソールアプリケーションです。サーバーコード:

class Program 
{ 
    static async void Run() 
    { 
     TcpListener listener = new TcpListener(IPAddress.Loopback, 5000); 
     listener.Start(); 
     Console.WriteLine("Server is running..."); 
     Console.WriteLine("Server is listening on port 5000..."); 

     while (true) 
     { 
      Console.WriteLine("Waiting for client..."); 
      Socket s = await listener.AcceptSocketAsync(); 
      //Socket s = listener.AcceptSocket(); 

      Console.WriteLine("Socket accepted."); 
     } 
    } 

    static void Main(string[] args) 
    { 
     Run(); 
    } 
} 

クライアントはWindowsフォームアプリケーションです。クライアントコードは:私は両方のプロジェクトを実行し、ボタンをクリックすると

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
     socket.Connect(new IPEndPoint(IPAddress.Loopback, 5000)); 
    } 
} 

は、私がSystem.Net.Sockets.SocketExceptionを取得(対象のコンピュータによって拒否されたため、接続できませんでした)。

同期サーバが正常に動作します:

//Socket s = await listener.AcceptSocketAsync(); 
Socket s = listener.AcceptSocket(); 

私は2日間を探していると私は助けることができる何かを発見していません。私は間違って何をしていますか?

ありがとうございました。

+4

サーバーはおそらくすぐに終了します。メソッドシグニチャを 'static async Task Run()'にして、 'main'メソッドでその結果を待つようにしてください:' Run()。Wait(); ' –

+0

@YacoubMassadこれは動作します。ありがとうございました。 – hinge

答えて

1

コンソールアプリケーションでは、これを実行するとアプリケーションが実際にすぐに終了します。あなたはこれを防ぐためにRun方法に.Wait()を起動する必要があります。

static void Main(string[] args) 
{ 
    Run().Wait(); 
} 

また、あなたのRun方法は、この(Taskが戻っ)のように定義する必要があります。それは火とされ、それ以外の場合は

static async Task Run() 
{ 
    // Omitted for brevity... 
} 

-忘れる。

関連する問題