在等待的连接异步方法完成时调用另一个方法

本文关键字:调用 另一个 方法 完成时 异步方法 连接 在等待 | 更新日期: 2023-09-27 18:35:03

我需要在等待 ConnectAsync 方法完成时调用另一个方法。我尝试线程池、循环等,但我仍然遇到同样的问题,因为当启动方法 ConnectAsync 时,会立即调用下一个方法,但我需要先完成 ConnectAsync 方法,然后调用我的方法。方法连接异步正在连接到我的 Web 套接字客户端中的服务器,当 Im 连接时,应该调用我的方法(方法导航到另一个页面(。知道吗?.

等待

的方法:等待套接字。连接异步(服务器(

我想要在等待完成时调用的方法:Frame.Navigate(typeof(MainContentPage((;

我的 Web 套接字客户端中的方法:

public async void _connect(string token, string idInstalation, string lang)
    {
        try
        {
            if (token!=null){
            socket.SetRequestHeader("Token", token);
            socket.SetRequestHeader("Lang", lang);
            socket.SetRequestHeader("idInstallation", idInstalation);
            }
            await socket.ConnectAsync(server);
            System.Diagnostics.Debug.WriteLine("Connected");
            connected = true;
            writer = new DataWriter(socket.OutputStream);
            messageNumber = 1;
        }
        catch (Exception)
        {
            var dialog = new MessageDialog("Cannot connect to server", "Error").ShowAsync();
        } 
    }
public static void connect(string token, string idInstalation, string lang)
    {
        instance._connect(token,idInstalation,lang);
    }

主页面在哪里调用websocket方法:

private void connectMe()
 {
  WebSocketClient.connect(null, null, null);
  Frame.Navigate(typeof(MainContentPage));
 }

在等待的连接异步方法完成时调用另一个方法

我有一篇MSDN文章,其中规定了一些准则。其中包括"避免async void"(即使用async Task而不是async void(。完成此操作后,您可以await连接方法:

public async Task connectAsync(string token, string idInstalation, string lang)
private async Task connectMeAsync()
{
  await WebSocketClient.connectAsync(null, null, null);
  Frame.Navigate(typeof(MainContentPage));
}

附言我强烈建议您使用 WebAPI 或 Azure 移动服务之类的东西,而不是基本套接字。TCP/IP 应用程序协议设计比最初出现时更困难。

另外,我有一个async介绍可能会有所帮助。

正如 Steven 已经指出的那样,您必须将方法的签名从 void 更改为 Task。这将允许您在异步方法完成后运行代码。

    public async Task _connect(string token, string idInstalation, string lang)
    {
        ...
    }
    public static Task connect(string token, string idInstalation, string lang)
    {
        await instance._connect(token,idInstalation,lang);
    }

然后你仍然需要调整你的调用方式:

    private void connectMe()
    {
        await WebSocketClient.connect(null, null, null);
        Frame.Navigate(typeof(MainContentPage));
    }

使用异步时,您必须一直等待它,直到在异步调用(例如"海龟一直向下"(后要执行的代码的位置。

您应该参考此处提供的答案。为了达到您感兴趣的效果,我会在Task中调用socket.ConnectAsync(server);然后调用WaitAll。我的意思是:

if (token!=null)
{
   socket.SetRequestHeader("Token", token);
   socket.SetRequestHeader("Lang", lang);
   socket.SetRequestHeader("idInstallation", idInstalation);
}
Task t = Task.Factory.StartNew(()=>{socket.ConnectAsync(server);});
Task.WaitAll(t);
System.Diagnostics.Debug.WriteLine("Connected");
connected = true;
writer = new DataWriter(socket.OutputStream);
messageNumber = 1;