Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 等待ConnectAsync方法完成时调用另一个方法_C#_Sockets_Asynchronous_Windows 8_Windows Store Apps - Fatal编程技术网

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

C# 等待ConnectAsync方法完成时调用另一个方法,c#,sockets,asynchronous,windows-8,windows-store-apps,C#,Sockets,Asynchronous,Windows 8,Windows Store Apps,我需要在等待ConnectAsync方法完成时调用另一个方法。我尝试了线程池、循环等,但仍然存在相同的问题,因为当启动方法ConnectAsync时,会立即调用下一个方法,但我需要先完成ConnectAsync方法,然后调用我的方法。方法ConnectAsync正在连接到我的web套接字客户端中的服务器,当Im连接时,应该调用我的方法(方法导航到另一个页面)。有什么想法吗 等待的方法:wait socket.ConnectAsync(服务器) 我希望在等待完成时调用的方法:Frame.Navig

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

等待的方法:wait 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));
 }

你应该参考提供的答案。为了达到您感兴趣的效果,我将调用
socket.ConnectAsync(服务器)
任务中
然后调用
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;

你应该参考提供的答案。为了达到您感兴趣的效果,我将调用
socket.ConnectAsync(服务器)
任务中
然后调用
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;
我有一份报告,其中规定了一些指导原则。其中包括“避免
async void
”(即使用
async Task
而不是
async void
)。完成此操作后,您可以等待连接方法:

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 void
”(即使用
async Task
而不是
async void
)。完成此操作后,您可以等待连接方法:

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应用程序协议的设计比最初出现的更为困难


另外,我还有一个可能有用的方法。

正如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时,您必须一直等待它,直到在异步调用后要执行的代码出现在哪里,例如“turtles all down”。

正如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时,您必须一直等待它,直到在异步调用(例如“turtles all way down”)之后您想要执行的代码出现在哪里