任务等待失败

时间:2015-06-09 11:41:52

标签: c# asynchronous async-await signalr task

我正在启动HubConnection。首先,我得到一个新的HubConnection实例, 之后我创建了一个名为“fileHub”的新IHubProxy,到目前为止还不错。

我的问题位于(或在)等待的函数ContinueWith,我尝试启动Connection,并在开始成功与否时写入控制台。 connection.Start()成功,“Connected”被写入控制台。 在执行Console.WriteLine(“已连接”)之后添加的代码也没有问题。

但是任务永远不会完成,因此调用HandleSignalRAsync()方法的客户端类等待完成失败。

添加回报;或task.dispose();并没有解决我的问题。

 public static async Task HandleSignalRAsync()
            {
                connection = new HubConnection("http://localhost:12754");

                myHub = connection.CreateHubProxy("fileHub");

                await connection.Start().ContinueWith(
                    task => 
                    {
                        if (task.IsFaulted)
                        {
                            var ex = task.Exception.GetBaseException();
                            Console.WriteLine("There was an error opening the connection: {0}", ex);
                        }
                        else
                        {
                            Console.WriteLine("Connected");                        
                        }
                    });

}

我在另一个解决方案类中使用TaskAwaiter调用Method:

Functions.HandleSignalRAsync().GetAwaiter().GetResult();

用以下方式调用它:

Functions.HandleSignalRAsync().Wait();

也不起作用。

1 个答案:

答案 0 :(得分:2)

  

但是任务永远不会完成

因为两个示例同步阻止,导致代码死锁。你不应该是blocking on async code

您需要正确地异步等待HandleSignalRAsync

await Functions.HandleSignalRAsync().ConfigureAwait(false);

如果您已经在使用async-await,那么使用ContinueWith的延续样式没有任何优势,您可以简单地将执行包装在try-catch语句中并await内:

try
{
    await connection.Start().ConfigureAwait(false);
    Console.WriteLine("Connected");
}
catch (Exception e)
{
    Console.WriteLine("There was an error opening the connection: {0}", e);
}