UWP AcceptAsync(SocketAsyncEventArgs e) 始终返回 true,并且从不调用 Soc

本文关键字:Soc 调用 true 返回 SocketAsyncEventArgs AcceptAsync UWP | 更新日期: 2023-09-27 17:56:47

我目前正在开发一个窗口应用程序。我想使用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);
    }
}

UWP AcceptAsync(SocketAsyncEventArgs e) 始终返回 true,并且从不调用 Soc

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

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

await 关键字告诉应用程序它将在哪里停止执行、返回并等待异步函数完成。完成后,它将返回到该await行并继续执行。

这是一篇关于 C# 异步编程的不错的 MSDN 文章

下面是有关 .NET 中的并行编程的 MSDN 博客条目

例如,假设我有一个函数,它从 Web 异步获取数据,但我不想在调用它时锁定 UI。

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

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

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

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

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

不过我们还没有完成,我们需要再添加一件事。由于我们在此异步操作中返回一些内容,因此我们需要返回一个 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);
    }
}