所以我正在写一个方法,该方法应该处理大量的字符串并更新处理过的每个字符串的UI。我正在使用async-await
模式来使用Progress记者,它将字符串报告给应该更新的主线程。 问题是:它不起作用。即使我使用了await关键字,用户界面也会被阻塞,就好像该方法同步运行一样。 这里是我的代码如下所示:如何让我的异步方法阻止用户界面?
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
任务
private async Task RunTask()
{
string filePath = //Get filePath somehow
await ProcessFile(filePath, new Progress<string>(line =>
{
ProcessedLabel.Text = line;
}));
}
的方法最后,这里的按钮回调的RunTask()任务有关:
private async void Button_Click(object sender, EventArgs e)
{
await RunTask();
}
我简化了代码的可读性。任何帮助是极大的赞赏。谢谢!
'File.ReadAllLines(filePath);'会这样做,读取所有行,所以如果存在多行的话,您最好逐行读取。这可能有帮助。我只是新来的异步我自己 –
你有没有尝试添加ConfigureAwait(false)到ProcessFile函数调用,因为很多次我看到了UI块。 – Chasefornone