Итак, я пишу метод, который должен обрабатывать большое количество строк и обновлять пользовательский интерфейс для каждой обрабатываемой строки. Я использую шаблон async-await
для этого, используя репортёр Progress, который сообщает строку в основной поток, где он должен быть обновлен. Проблема в том, что она не работает. Пользовательский интерфейс блокируется, как если бы метод выполнялся синхронно, хотя я использовал ключевое слово ожидания. Вот что мой код выглядит следующим образом:Как сохранить мой асинхронный метод от блокировки пользовательского интерфейса?
private async Task ProcessFile(string filePath, IProgress<string> progress)
{
string[] LinesToProcess = File.ReadAllLines(filePath);
int LineCount = Buffer.Count();
await Task.Factory.StartNew(() =>
{
for (int i = 0; i < Buffer.Count(); i++)
{
//Do actual processing here
progress.Report(string.Format("Lines processed: {0}/{1}", i, LineCount));
}
});
}
А вот метод вызова ProcessFile
Task
private async Task RunTask()
{
string filePath = //Get filePath somehow
await ProcessFile(filePath, new Progress<string>(line =>
{
ProcessedLabel.Text = line;
}));
}
И, наконец, вот кнопка обратного вызова, что Task RunTask() связан с:
private async void Button_Click(object sender, EventArgs e)
{
await RunTask();
}
Я упростил код для удобочитаемости. Любая помощь приветствуется. Спасибо!
'File.ReadAllLines (filePath);' будет делать именно это, читать все строки, поэтому, если есть выделение строк, вам лучше читать строки за строкой. Это может помочь. Я новичок только в Async –
Вы когда-нибудь пытались добавить ConfigureAwait (false) в вызов функции ProcessFile, я видел блоки пользовательского интерфейса из-за этого много раз. – Chasefornone