UWP AcceptAsync(SocketAsyncEventArgs e)始终返回true,从不调用SocketAsyncEventArgs.Completed的方法

时间:2016-07-12 15:03:34

标签: c# uwp

我正在开发一个窗口应用程序。我想使用AcceptAsync方法。 目前,System.Net.Sockets.AcceptAsync(SocketAsyncEventArgs e)中似乎有很多混乱,总是返回真实和 永远不会调用Accept_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);
    }
}

1 个答案:

答案 0 :(得分:0)

您不能只调用异步函数并让它以异步方式运行。您需要将async关键字添加到函数签名中,并将await关键字添加到进行异步调用的行。

函数签名中的async关键字将使此函数成为异步启用函数。

await关键字告诉应用程序它将停止执行,返回和等待异步函数完成的位置。完成后,它将返回到await行并继续执行。

这是一个不错的MSDN article on Asynchronous programming in C#

这是MSDN Blog entry on Parallel Programming in .NET

例如,让我说我有一个函数可以异步地从网络获取数据但我不想在我调用它时锁定用户界面。

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

目前,我的GetWebData()函数将同步运行,因为我没有实现C#异步模式。

为了让它以异步方式运行,我们需要添加两个关键字。 asyncawait

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

这将告诉我们的应用程序运行直到await关键字,然后停止你正在做的事情,标记位置并退出该功能。当等待的操作完成执行时,应用程序将返回其标记的位置并继续处理。

我们还没有完成,我们还需要添加一件事。由于我们在此异步操作中返回了一些内容,因此我们需要返回一个Task。在我们的示例中,我们需要一个Task。如果您没有返回任何内容,则可以将其设置为无效。

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);
    }
}