Я использовал в прошлом BackgroundWorker
в приложении Windows Form. Для моего нового упражнения мне нужно использовать методы async
внутри рабочего, и я немного немного смущен.BackgroundWorker, который использует методы async HttpClient
Это моя структура кода. В случае загрузки формы я создание BackgroundWorker
объекта и установки события
private void fMain_Load(object sender, EventArgs e) {
bw = new BackgroundWorker();
bw.WorkerReportsProgress = true;
bw.DoWork += new DoWorkEventHandler(bw_DoWork);
bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
}
Когда пользователь нажимает кнопку, я начинаю работник
private void btnGenerate_Click(object sender, EventArgs e) {
Settings settings = new Settings();
pbCounter.Visible = true;
btnGenerate.Enabled = false;
bw.RunWorkerAsync(settings);
}
И это код работника
private async void bw_DoWork(object sender, DoWorkEventArgs e) {
try {
for (int ix = 1; i <= 100; i++) {
using (var client = new HttpClient()) {
[???? how to call and wait here ????]
HttpResponseMessage response = await client.PostAsync("endpoint", new StringContent(JsonConvert.SerializeObject(formContent), Encoding.UTF8, "application/json"));
}
//The counter will keep track of your process
Application.DoEvents();
int percentage = ix * 100/settings.TotalRuns;
bw.ReportProgress(percentage);
}
}
catch (Exception ex) {
MessageBox.Show(ex.Message, "Gift Creator", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
Я не думаю, что «BackgroundWorker» хорошо играет с асинхронным ожиданием. Вероятно, вы должны использовать что-то другое (или создать его). – i3arnon
Это не может работать. Если вы создаете обработчик 'DoWork'' async' и используете 'await' внутри, метод возвращается туда, и рабочий фон будет завершен. Я думаю, что вам не нужен фоновой работник при использовании async, но нужно подумать о том, как тогда будет вести отчет. –
@ RenéVogt: справа. Я думал бросить фонового работника. Однако мне очень нравится, как он обрабатывает уведомление о ходе. Любое предложение? – Lorenzo