Вы можете использовать оператор await для того чтобы дождавшись окончания асинхронной операции, получить возвращаемое ею значение.
string hart = await example.ExampleTask();
Имейте в виду, однако, три вещи.
Для того, чтобы было возможно использовать оператор await, при объявлении метода необходимо использовать оператор async.
private async void MyMethod {
Весь код, который идет после строчки с оператором await выполняется асинхронно. То есть, выполнение метода MyMethod закончится на той строчке, на которой стоит оператор await, и управление будет передано в метод его вызывающий. Код, который вы напишете после оператора await, и который будет использовать переменную hart, выполнится только тогда, когда Task завершится.
Если метод Main не будет ожидать окончания задачи, то приложение завершится. В этом случае код после await может никогда не выполнится. Чтобы этого избежать, необходимо каким-то образом остановить выполнение метода Main. В этом случае, вам не подойдет решение с использованием оператора await. Придется дождаться окончания выполнения Task с помощью метода Wait.
Task<string> task = example.ExampleTask();
task.Wait();
string hart = task.Result;
Второй нюанс зачастую не приводит к проблемам, но все равно о нем следует помнить. И если ваш код как-то не так работает, попробуйте
проанализировать как он будет выполняться учитывая этот второй нюанс.
Скорее всего, после этого сразу станет понятно как исправить код.
Третий нюанс не возник бы в приложении, в котором запущен UI поток
(WinForms, WPF), потому что такие приложения продолжают
функционировать даже после того, как ваш код прекратил выполняться.
Mainне может быть асинхронным. – trydex Jun 25 '17 at 14:35