【问题标题】:Call another method when awaited ConnectAsync method finish等待 ConnectAsync 方法完成时调用另一个方法
【发布时间】:2013-10-10 19:31:12
【问题描述】:

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

等待方法:await socket.ConnectAsync(server)

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

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

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

【问题讨论】:

    标签: c# sockets asynchronous windows-8 windows-store-apps


    【解决方案1】:

    我有一个MSDN article,它制定了一些指导方针。其中包括“避免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 intro 可能会有所帮助。

    【讨论】:

      【解决方案2】:

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

      使用 async 时,您必须一直等待它,直到您拥有要在 async 调用之后执行的代码,例如“乌龟一路下来”。

      【讨论】:

        【解决方案3】:

        您应该参考提供的答案here。为了达到您感兴趣的效果,我会在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;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-11-29
          • 2023-04-08
          • 2012-07-10
          • 1970-01-01
          • 2022-11-19
          • 2022-08-07
          相关资源
          最近更新 更多