使用Async / Await时的WPF ProgressBar用法

我有一个非常简单的任务,加载一些数据,如下所示:

async Task<List> GetInvoices() { var invoices = await Task.Run(() => db.Invoices.AsNoTracking().ToList()); return invoices; } 

使用进度条的最佳方法是什么? 我不需要加载百分比(尽管这会很有用),我只需要在加载数据的开始和结束时显示/隐藏进度条。 有没有办法创建一个完成或完成的方法?

我是非常新的异步/等待所以小孩手套请!

假设GetInvoices在某个UI事件处理程序中被调用,并且有一些名为ProgressBar进度条控件,它非常简单:

 private async void OnButton1Click(..) { ProgressBar.IsIndeterminate = true; var result = await GetInvoices(); ProgressBar.IsIndeterminate = false; // Maybe hide it, too // TODO: Do stuff with result } 

如果要显示实际进度,请查看ProgressIProgress

你已经拥有了你需要的东西。 这里举例说明一个简单的例子,包括任务和使用await,以及ContinueWith。

 using System; using System.Threading.Tasks; using System.Diagnostics; public class Program { public static void Main() { Task t = new Program().TestTasks(); Console.WriteLine("hello"); t.Wait(); } public async Task TestTasks() { Stopwatch watch = Stopwatch.StartNew(); Console.WriteLine("1." + watch.ElapsedMilliseconds); // await task int res = await TestAsync(); Console.WriteLine("2." + watch.ElapsedMilliseconds + " " + res); // save task and wait on it Task t = TestAsync(); t.ContinueWith((r) => { Console.WriteLine("4." + watch.ElapsedMilliseconds + " " + r.Result); }); Console.WriteLine("3." + watch.ElapsedMilliseconds); t.Wait(); } public static async Task TestAsync() { await Task.Delay(TimeSpan.FromSeconds(2)); return 42; } } 

这打印:

 1.0 hello 2.2009 42 3.2009 4.4013 42 

注意await如何离开方法并在Main方法中打印“hello”,并在TestTasks方法中继续(大约)2秒后继续。 另一方面,如果我们等待,如第二次调用TestAsync所示,则立即打印3.然后在2秒后打印4.

考虑到这一点,您可以在返回任务时调用方法GetInvoices

 // Set state of progressbar to indeterminate List result = await GetInvoices(); // Set state of progressbar to nothing 

你可以这样做:

 var task = Task.Run(() => db.Invoices.AsNoTracking().ToList()); //show progress task.ContinueWith(...CLOSE PROGRESS BAR...); 

在实践中,您使用Task.ContinueWith构造来捕获任务的终止并隐藏您之前显示的进度条。

注意:请记住,对另一个线程的UI元素进行操作需要Invoke() ,因为该调用将实际调用重定向到主线程,这是一个唯一的线程,可以在Windows上操作UI控件。