Рассмотрим эту часть события нагрузки для основной формы:Ожидание Задача внутри ожидаемой задачи - когда выполняется оставшаяся часть кода?
private async void MainForm_Load(object sender, EventArgs e)
{
var ServerConfigFile = new ClientConfigFile(Environment.CurrentDirectory);
ServerConfigFile.GenerateConfigFile();
var taskCheck = Task.Run(() => CheckUpdate());
await taskCheck;
lblUpdateMessage.Text = "Finished...";
//more code here
}
И сам CheckUpdate
функцию:
private async void CheckUpdate()
{
var connection = new ServerConnection(this);
Helper.CrossThreadInvoke(lblFileDownload,() => lblFileDownload.Text = "Downloading");
Helper.CrossThreadInvoke(lblFileDownload,() => lblFileDownload.Text = "Done");
var taskConfig = Task.Run(() => connection.GetServerConfig());
await taskConfig;
///some unrelated control changes here
}
ли этот код ожидает правильно для CheckUpdate
, чтобы завершить работу всех его кода (включая комментируемого контроль изменений в конце)? Мое рассуждение состоит в том, что он начинает Task
с CheckUpdate
в нем, и awaits
, возвращая управление на MainForm
.забрасывает Task
с GetServerConfig
в положение awaits
, после чего возвращается на MainForm_Load
, но так как он ждет CheckUpdate
, он не переходит на lblUpdateMessage.Text = "Finished...";
. Или я ошибаюсь?
Tl; др ли этот код Actaully ждет все CheckUpdate
закончить перед отображением Finished
?
Есть причина, вы не можете просто попробовать и посмотреть? –
Я пытаюсь, и он терпит неудачу - пытаясь понять, почему это не работает. Есть ли причина, по которой вы прокомментировали без каких-либо фактических советов о том, как справиться с ней или как улучшить эту должность? – Janushoff
Почему вы используете метод в фоновом потоке только для того, чтобы он планировал работу для запуска в потоке пользовательского интерфейса или в другом фоновом потоке? Просто запустите его в потоке пользовательского интерфейса. – Servy