我在这里有以下代码:
public class ProcessTaskAsyncExProgress
{
public int ProgressPercentage { get; set; }
public string Text { get; set; }
}
public static class ProcessTask
{
public static async Task<string> Start(IProgress<ProcessTaskAsyncExProgress> progress)
{
const int total = 10;
for (var i = 0; i <= total; i++)
{
Thread.Sleep(300);
if (progress != null)
{
var args = new ProcessTaskAsyncExProgress
{
ProgressPercentage = (int)(i / (double)total * 100.0),
Text = "processing " + i
};
progress.Report(args);
}
}
return "Done";
}
}
在Form1.cs中
private async void button1_Click(object sender, EventArgs e)
{
var result = await StartTask();
}
private async Task<string> StartTask()
{
var progress = new Progress<ProcessTaskAsyncExProgress>();
progress.ProgressChanged += (s, e) =>
{
progressBar1.Value = e.ProgressPercentage;
listBox1.Items.Add(e.Text);
listBox1.SelectedIndex = listBox1.Items.Count - 1;
};
return await ProcessTask.Start(progress);
}
我遇到的问题是循环运行时进度条和列表框没有填充。 UI仅在整个循环完成后更新,显示的内容是listview中的10个项目和100%进度条。
我的代码应该如何使UI线程不被挂起?
答案 0 :(得分:3)
Thread.Sleep(300);
是一个阻塞调用,它在UI线程上运行,这就是为什么你没有在UI上获得更新。您需要使用await Task.Delay(300);
代替