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