2016-07-12 1 views
1

現在、ウィンドウアプリケーションを開発中です。私はAcceptAsyncメソッドを使用したいと思います。 現時点では、System.Net.Sockets.AcceptAsync(SocketAsyncEventArgs e)には厄介なものが多く見受けられますが、 の方法は常にAccept_Completedと呼ばれることはありません。UWP AcceptAsync(SocketAsyncEventArgs e)は常にtrueを返し、SocketAsyncEventArgs.Completedメソッドを呼び出すことはありません

private void ProcessAccept(SocketAsyncEventArgs e) 
{ 
    e.Completed += new EventHandler<SocketAsyncEventArgs>(Accept_Completed); 
    e.AcceptSocket = null; 

    bool waitFlag = listeningSocket.AcceptAsync(e); 

    if (!waitFlag) 
    { //operation completed synchronously 
     Accept_Completed(null, e); 
    } 
} 

答えて

0

非同期関数を呼び出して非同期に実行することはできません。関数の署名にasyncキーワードを追加し、非同期呼び出しが行われている行にawaitキーワードを追加する必要があります。

関数シグニチャのasyncキーワードは、この関数を非同期対応機能にします。

awaitキーワードは、アプリケーションの実行を停止し、戻り値を返し、async関数が完了するまで待機します。完了すると、それはawait行に戻り、実行を続けます。ここで

はここで素敵なMSDN article on Asynchronous programming in C#

あるのは、私は非同期的にウェブからのデータを取得する機能を持っているとしましょうが、私は、私が呼び出したときにUIをロックしたくない例えばMSDN Blog entry on Parallel Programming in .NET

ですそれ。

private string GetWebData(){ 
    return MyWebRequests.GetWebDataAsync(); 
} 

私はC#の非同期パターンを実装しておりませんので、現在、私のGetWebData()関数は同期的に実行されます。

これを非同期で実行するには、2つのキーワードを追加する必要があります。 asyncおよびawaitである。

private async string GetWebData(){ 
    return await MyWebRequests.GetWebDataAsync(); 
} 

これは、何をやっている停止し、その後、のawaitキーワードまで実行するために私たちのアプリケーションを教えてくれた場所をマークし、機能を終了します。待機している操作の実行が終了すると、アプリケーションはそのマークされた場所に戻り、処理を続行します。

まだ完了していません。もう1つ追加する必要があります。この非同期操作で何かを返すので、タスクを返す必要があります。この例では、タスクが必要です。あなたが何かを返さないならば、それを無効にすることができます。

private async Task<string> GetWebData(){ 
    return await MyWebRequests.GetWebDataAsync(); 
} 

これだけです!

ここでコードを見てみましょう。

private async void ProcessAccept(SocketAsyncEventArgs e) 
{ 
    e.Completed += new EventHandler<SocketAsyncEventArgs>(Accept_Completed); 
    e.AcceptSocket = null; 

    bool waitFlag = await listeningSocket.AcceptAsync(e); 

    if (!waitFlag) 
    { //operation completed synchronously 
     Accept_Completed(null, e); 
    } 
} 
+0

これは非同期機能ではありませんが、System.Net.Sockets.Socket.AcceptAsync組み込み関数であり、それは待たれません! https://docs.microsoft.com/lv-lv/dotnet/api/system.net.sockets.socket.acceptasync – Arvis

+0

おそらく、なぜ彼らは答えを受け入れなかったのでしょう。あなたが解決策を持っているなら、私はいつも学びたいと思っています。答えをアップアップします。これを明確にしてくれてありがとう。 –

関連する問題