Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用TPL异步更新进度条_C#_.net_Progress Bar_Task Parallel Library_Async Await - Fatal编程技术网

C# 使用TPL异步更新进度条

C# 使用TPL异步更新进度条,c#,.net,progress-bar,task-parallel-library,async-await,C#,.net,Progress Bar,Task Parallel Library,Async Await,我这里有以下代码: public class ProcessTaskAsyncExProgress { public int ProgressPercentage { get; set; } public string Text { get; set; } } public static class ProcessTask { public static async Task<string> Start(IProgress<ProcessTaskAs

我这里有以下代码:

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";
    }
}
公共类ProcessTaskAsyncExProgress
{
公共整数百分比{get;set;}
公共字符串文本{get;set;}
}
公共静态类ProcessTask
{
公共静态异步任务启动(IProgress进程)
{
const int total=10;
对于(var i=0;i
{
progressBar1.值=e.ProgressPercentage;
listBox1.Items.Add(e.Text);
listBox1.SelectedIndex=listBox1.Items.Count-1;
};
返回等待处理任务。开始(进度);
}
我遇到的问题是,循环运行时不会填充进度条和列表框。UI只有在整个循环完成后才会更新,显示的是listview中的10个项目和100%的进度条

我的代码应该如何使UI线程不被挂起?

线程。睡眠(300);
是一个阻塞调用,它在UI线程上运行,这就是为什么你不能在UI上获得更新。你需要使用
等待任务。延迟(300);
而不是
线程。睡眠(300);
是一个阻塞调用,它在UI线程上运行,这就是为什么您不能在UI上获得更新。您需要使用
等待任务。延迟(300);

    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);
    }