2013-10-10 2 views
0

Мне нужно вызвать другой метод в ожидании завершения метода ConnectAsync. Я пытаюсь использовать пул потоков, циклы и т. Д., Но у меня по-прежнему есть одна и та же проблема, потому что при запуске метода ConnectAsync немедленно вызывается следующий метод, но мне нужно сначала закончить метод ConnectAsync, а затем вызвать мой метод. Метод ConnectAsync подключается к серверу в моем клиенте веб-сокета, и когда Im подключен, тогда должен быть вызван мой метод (метод перейдет на другую страницу). Есть идеи? ,Вызов другого метода при ожидании завершения метода ConnectAsync

Ожидаемый метод: ждут socket.ConnectAsync (сервера)

Мой метод, который я хочу назвать, когда ожидаемый финиш: 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)); 
} 

ответ

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 Mobile Services вместо сокета bare-bones. Разработка протокола протокола TCP/IP сложнее, чем в первую очередь.

Кроме того, у меня есть async intro, который может пригодиться.

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; 
2

Как уже указывал Стивен, вы должны изменить подписи своих методов от пустоты до задачи. Это позволит вам запускать код после завершения асинхронного метода.

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

При работе с асинхронной вы должны ждать его вплоть до того, где вы свой код, который вы хотите выполнить после асинхронный вызов, например «черепахи полностью вниз».

Смежные вопросы