Вернуть метод Main к void, но сохранить работоспособность кода

Есть такой код:

class Program
{
    static async Task Main()
    {
        await DownloadAsync();
    }

    static async Task DownloadAsync()
    {
        var options = new ProgressBarOptions
        {
            ProgressCharacter = '─',
            ProgressBarOnBottom = true
        };
        const int totalTicks = 100;
        using (WebClient wc = new WebClient()) 
        {
            var pbar = new ProgressBar(totalTicks, "Initial message", options);
            wc.DownloadProgressChanged += (s, e) => { pbar.Tick(e.ProgressPercentage,"Download XML Plugin..."); };
            await wc.DownloadFileTaskAsync(new Uri("http://dev.osel.pp.ua/Consulo/Plugins/com.intellij.xml_2961.zip"),"/home/ketronix/xml.tar.gz");
        };
    }
}

И лично мне кажется, что то, что метод Main имеет тип Task, не есть хорошо. Как сделать так, чтобы он был void и, при этом, при вызове метода загрузки файле, в отдельном потоке рисовался прогресс бар и синхронизировался с прогрессом загрузки? По сути нужно просто как-то сделать вместо Task - void, и при этом сохранить работоспособность.

Всем спасибо.


Ответы (1 шт):

Автор решения: iiKuzmychov

Асинхронный Main это как раз синтаксический сахар, который призван сократить рутину и упростить код. В вашем случае нет никакого смысла в том, чтобы "вернуть void".

Конструкция

static async Task Main() { ... }

превращается компилятором в

private static void $GeneratedMain() =>
    Main().GetAwaiter().GetResult();
→ Ссылка