Причина в том, что вы забыли дождаться результатов CheckStatus()
перед тем, как получить доступ к результату.
Обычно асинхронные функции заканчиваются именем async.Это сделано для того, чтобы предупредить пользователей о том, что они не должны забывать, что они используют async-await и что им следует дождаться возвращаемого значения, прежде чем получить доступ к результату.
Это также дает то преимущество, что вы можете предложить как обычную версию, так иасинхронная версия
async Task<int> GetRetirementsAsync(){...}
async Task<Tuple<int, int, int, int>> CheckStatusAsync()
{
...
int retired = await GetRetirementsAsync();
return new Tuple...
}
async Task GetCheckStatusAsync()
{
var tuple = await CheckStatusAsync();
// process output:
LblOut.Text = tuple.Item1.ToString();
LblStage.Text = tuple.Item2.ToString();
LblRetired.Text = tuple.Item3.ToString();
LblStop.Text = tuple.Item4.ToString();
}
Возможное улучшение производительности
Причина, по которой вы хотите использовать GetRetirementsAsync вместо не асинхронного GetRetirements, заключается в том, что вы ожидаете, что где-то глубоко внутри процессабездействовать в ожидании результатов другого процесса, например, при запросе базы данных, чтении файла или получении данных из Интернета.
Вместо ожидания в режиме ожидания вы можете использовать async await для выполнения других задач, пока вам действительно не понадобитсярезультаты из базы данных.
Вы делаете это, запуская задачу, не дожидаясь.Поток не будет бездействовать в ожидании базы данных, но продолжит обрабатывать ваши операторы до тех пор, пока вам не понадобится результат и не дождаться выполнения задачи.
private async Task<Tuple<int, int, int, int>> CheckStatus()
{
// Get the retirements, do not await yet.
Task<int> taskGetRetirements = GetRetirementsAsync();
// instead of waiting idly, your thread is free to do the following:
int out = 0;
int stage = 0;
int retired = 0;
int stop = 0;
for (int i = 0; i < Dgv.Rows.Count; i++)
{
...
}
// now you need the retirements; await for the task to finish
int retired = await taskGetRetirements;
stage = stage - retired;
return new Tuple<int, int, int,int>(out, stage, retired, stop);
}