Task await fails

770 views Asked by At

I am starting a HubConnection. First I get a new Instance of HubConnection, afterwards I create a new IHubProxy with Name = "fileHub" so far so good.

My problem is located at (or in) the awaitable Function ContinueWith, I try to start the Connection, and write to the console wheater the start was successful or not. The connection.Start() is successful and "Connected" is written to the console. Code added after the Console.WriteLine("Connected") is executed without problems, too.

But the Task never finishes, so the Client Class calling the HandleSignalRAsync() Method waits for the completion unsuccessfully.

Adding a return; or task.dispose(); does not solve my issue.

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

}

I call the Method with the TaskAwaiter in another Class of my Solution:

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

calling it with:

Functions.HandleSignalRAsync().Wait();

does not work, too.

1

There are 1 answers

0
Yuval Itzchakov On BEST ANSWER

But the Task never finishes

Because both examples synchronously block, causing your code to deadlock. You shouldn't be blocking on async code.

You'll need to properly asynchronously wait on HandleSignalRAsync:

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

If you're already using async-await, there's no advantage to use a continuation style with ContinueWith, you can simply wrap the execution in a try-catch statement and await inside:

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