Вы попали в тупик, потому что вы переключаетесь с асинхронной на синхронизацию, а 2 вещи / процессы имеют разные контексты синхронизации.
Вы не можете сделать конструктор асинхронным, но в качестве обходного пути вы можете превратить его в задачу ожидания:
public Form1() {
InitializeComponent();
Task.WaitAll(Task.Run( async ()=> await Prepare()));
}
Вам не нужна переменная Task t
. Поскольку Prepare
не возвращает никаких возвращаемых значений, вы можете просто дождаться его. Я полагаю, вы сделали этот пример, чтобы представить некоторую проблему, которая у вас есть Обычно, если вы начинаете с async
и await
, вам нужно накачать его до самого высокого уровня графического интерфейса. Любое прерывание синхронной обработки приведет к тупику
EDIT:
После вашего комментария:
Я хочу создать долгосрочное задание (пример неверен в конструкторе), запустить его, и когда мне понадобится результат, проверить, завершено или нет задание, например, в событии.
Я бы предложил запустить задачу в конструкторе:
t = Task.Run(async ()=> await Prepare());
и ждите его в событии OnPaint
, которое вы должны сделать async
, чтобы он не блокировал пользовательский интерфейс:
protected override async void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
await t;
Console.WriteLine($"Finish");
}