大家好.这是Brian Lagunas,在本视频中,我将向您展示如何实现一些多线程,并使用新的Xam BusyIndicator控件向最终用户报告长时间运行的进程的进度,该控件刚刚与Infragistics Ultimate 15.2 WPF控件一起发布。
我们这里有一个应用程序,它有一个视图和一个视图模型。这个观点非常简单。它包含一个列表框,这是绑定到项目的集合,然后我们有一个按钮,将启动创建这些项目的过程。我们正在使用Prism的视图模型定位器来设置视图模型的数据上下文,所以让我们来看看视图模型。正如你所看到的,我们有一个属性,一个字符串列表,它将表示我们正在创建的项目。我们有我们的命令,称为启动进程命令,它绑定到我们UI中的按钮。单击此按钮时,将调用该命令,我们将生成要添加到此字符串列表中的1000万项,我们的列表框将绑定到该列表中。
如果我们运行的应用程序,因为它是,我们可以看到,我们有我们的列表框在这里,没有什么去。然后,我将单击 “开始进程” 按钮。我可以立即看到我们的UI被冻结,我无法移动任何东西,我不知道发生了什么,作为最终用户它只是卡住了。当这个过程完成时,UI再次变得响应,现在我可以看到我们创建的项目。这不是我们想要的。我们首先要做的是创建一个多线程环境。我们将采取我们目前所拥有的,并使其多线程。我们将使用dot net中新的Async 08功能来使用它。
首先,让我们继续将此generate items方法转换为异步方法。我将通过创建一个新任务来做到这一点,我只是将我们已经拥有的东西包装在一个任务中,然后我们必须返回一个任务。我们要说 “returntask.Run”,然后我们将把当前的逻辑包装在task.Run中。我们要做的下一件事是开始处理方法,添加异步,然后在生成项目之前添加等待。现在让我们再次运行此应用程序。
让我们看看当我点击开始进程按钮时会发生什么。如您所见,UI保持响应。我不知道到底是怎么回事,因为我点击了按钮…哦,出事了。显然,背景中发生了一些事情。这是因为我们采取了长时间运行的进程,并把它卡在一个单独的线程,所以我们的用户界面保持响应。下一步是让我们的最终用户知道,嘿,有些事情正在发生,有一个过程正在进行,所以不要到处点击。要有耐心,然后你会看到这个过程的结果。
为此,我们将修改我们的UI,以利用刚刚与我们的WPF控件一起发布的新Xaml BusyIndicator控件。我进入我的工具箱,我要找到Xaml BusyIndicator。我只是要把它拖到我的视图,然后我要做的是我要实际包装我们当前的视图与Xaml BusyIndicator。为了显示Xaml BusyIndicator,我们必须将is busy属性绑定到视图模型中的属性。我们假设这叫做 “很忙”。这意味着我们必须去我们的视图模型,我们必须添加一个新的属性。这将是一个名为 “忙碌” 的金条。接下来,我们将在开始流程之前将is busy设置为true,然后在流程完成后将其设置为false。让我们运行应用程序。
现在我要开始处理,现在我们可以看到正在发生的事情。有一个过程在后台进行,我的UI保持响应,但作为最终用户,我知道发生了一些事情,现在BusyIndicator消失了,我们的结果显示给我们。假设我对那个动画不满意。BusyIndicator实际上有许多动画可供选择。它实际上有八个,我们有azure,齿轮,进度条,进度环,让我们坚持使用azure。让我们去azure。
现在我们有了azure动画。我只是要运行应用程序,我要重新开始这个过程,现在我们有了一个新的动画。您可以看到start process按钮已显示为灰色,因为BusyIndicator覆盖了所有交互点,这样我们的最终用户就不会感到困惑。真正酷的是,我们可以修改azure动画,说: “你知道吗,我希望顶部元素是绿色的,或者较低的元素是绿色的,我们会把顶部的元素变成红色的。”我们正在改变动画的颜色。正如你所看到的,这些颜色反映在动画显示。
现在我们已经能够显示BusyIndicator并播放动画并更改动画的颜色,让我们返回并报告进度。目前我们所拥有的被称为不确定动画。动画一直在旋转,旋转,旋转,我们不知道什么时候结束,我们只知道发生了什么。假设我们知道我们在这个过程中走了多远。我们有许多记录,我们知道已经创建了多少记录。我想向最终用户报告我们所处位置的进度。首先,让我们从报告异步操作的进度开始。让我们开始创建一个新的I进度T,这将是一个双。我们会取得新的进展。然后,在此更新过程中,我们将传递百分比以更新UI。这意味着我们需要一个新的财产。这将是双重的。然后在这里,我们将设置进度等于百分比。现在,计算这个百分比就更容易了。基本上会说,“如果我mod,假设1500等于0,我们将I除以最大记录数,得到完成的百分比。”然后我们将取得进展并报告该百分比。现在,我们这样做的原因是因为我们不想用更新消息淹没我们的UI。我们只是想时不时地更新。
下一步是更新我们的UI。首先,让我们继续改变我们的动画。我们需要一个显示进度的动画。让我们去进步戒指。现在我们要设置属性是不确定等于false,因为现在我们有一个确定的状态,我们要管理。然后,我们采取的进度值,我们创建一个绑定的进度属性,我们在视图模型中更新。让我们运行应用程序。启动该过程。现在我们可以看到UI更新了我们正在运行的当前任务的完成百分比。当它100% 时,结果将显示给我们的最终用户。这就是全部。如您所见,可以非常容易地向应用程序添加多线程,并使用Infragistics Ultimate WPF控件中提供的新Xam BusyIndicator控件向最终用户报告长时间运行的进程的进度。</p