Run an async task in a console app and return a result


I had someone ask how to run an async task in Main of a console app.  Yes there are different ways to do it and this is just one!

 

using System;
using System.Net.Http;
using System.Threading.Tasks;

namespace UrlAuth
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                // Start a task - calling an async function in this example
                Task<string> callTask = Task.Run(() => CallHttp());
                // Wait for it to finish
                callTask.Wait();
                // Get the result
                string astr = callTask.Result;
                // Write it our
                Console.WriteLine(astr);
            }
            catch (Exception ex)  //Exceptions here or in the function will be caught here
            {
                Console.WriteLine("Exception: " + ex.Message);
            }


        }

        // Simple async function returning a string...
        static public async Task<string> CallHttp()
        {
            // Just a demo.  Normally my HttpClient is global (see docs)
            HttpClient aClient = new HttpClient();
            // async function call we want to wait on, so wait
            string astr = await aClient.GetStringAsync("http://microsoft.com");
            // return the value
            return astr;
        }
    }
}

Drop me a note if this helped you out!


Comments (4)

  1. MarkV says:

    I've been searching for a way to do this for two days now, and nothing I've found even works - plus most of the "solutions" are implausibly complicated (there's GOT to be a better way).

    This is the only thing I've found that works, and it's super easy. Thank you!

    ...but I have to ask, are there any downsides to this technique?

    1. Jeff Sanders says:

      Hi @MarkV. No there are no downsides to this technique!

  2. There are other ways to do this, but for me this method is the easiest to implement and understand. It was just what I was looking for.

  3. Scott says:

    This helped me a great deal. I am no asychronous programming giant. However, I believe this was an earlier .net method of doing it. I tried starting an asynchronous method having a return type of Task using the newer await keyword in the Main method of a console application. The compiler reports: "Error CS4033: The 'await' operator can only be used within an async method. Consider marking this method with the 'async' modifier and changing its return type to 'Task'. It suggests to change the Main method to use the async keyword and then thinks all is well until you attempt to run the console app and it tells you: "error CS4009: an entry point cannot be marked with the 'async' modifier. Seems like the older method has some advantages. Thanks for the help

Skip to main content