0

当等待 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));
 }
4

3 回答 3

2

我有一篇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));
}

PS 我强烈建议您使用 WebAPI 或 Azure 移动服务之类的东西,而不是简单的套接字。TCP/IP 应用协议设计比它最初看起来要困难得多。

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

于 2013-10-10T21:55:54.317 回答
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 时,您必须一直等待它直到您想要在异步调用之后执行代码的位置,例如“一路乌龟”。

于 2013-10-11T08:56:48.757 回答
0

您应该参考此处提供的答案。为了达到你感兴趣的效果,我会调用socket.ConnectAsync(server);then Taskcall 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;
于 2013-10-10T20:30:24.923 回答