等待ConnectAsync方法完成时调用另一个方法

时间:2013-10-10 19:31:13

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

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

等待方法:等待socket.ConnectAsync(服务器)

等待完成后我想要调用的方法: 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));
 }

3 个答案:

答案 0 :(得分:2)

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

P.S。我强烈建议您使用WebAPI或Azure移动服务而不是简单的套接字。 TCP / IP应用协议设计比最初出现时更难。

另外,我有async intro可能会有帮助。

答案 1 :(得分: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));
    }

使用异步时,您必须等待一直到您要在异步调用后执行的代码所在的位置,例如“乌龟一路下来”。

答案 2 :(得分:0)

您应该参考提供的答案here。为了达到您感兴趣的效果,我会在socket.ConnectAsync(server);中致电Task,然后致电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;