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);
}
}
你不能只调用一个异步函数并让它异步运行。您需要将 async
关键字添加到函数签名中,并将 await
关键字添加到进行异步调用的行中。
函数签名中的 async
关键字将使此函数成为启用异步的函数。
await
关键字告诉应用程序它将在哪里停止执行、返回并等待异步函数完成。完成后,它将返回到该await
行并继续执行。
这是一篇关于 C# 异步编程的不错的 MSDN 文章
下面是有关 .NET 中的并行编程的 MSDN 博客条目
例如,假设我有一个函数,它从 Web 异步获取数据,但我不想在调用它时锁定 UI。
private string GetWebData(){
return MyWebRequests.GetWebDataAsync();
}
目前,我的 GetWebData()
函数将同步运行,因为我没有实现 C# 异步模式。
为了使它异步运行,我们需要添加两个关键字。 async
,await
。
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);
}
}