【发布时间】:2013-10-15 23:08:41
【问题描述】:
我正在尝试在(相当简单的)应用程序中实现异步等待的东西。 我的目标是在等待之间更新busyIndicator。
我不知道是什么,但我认为我在理解 async await 的东西时遗漏了一些重要的东西。
private async void StartTest(object obj)
{
try
{
this.IsBusy = true;
this.BusyMessage = "Init..."
await Task.Delay(7000);
var getData1Task = this.blHandler.GetData1Async();
this.BusyMessage = "Retreiving data...";
this.result1 = await getDeviceInfoTask;
this.result2 = await this.blHandler.GetData2Async();
this.BusyMessage = "Searching...";
this.result3 = await this.blHandler.GetData3();
}
finally
{
this.IsBusy = false;
this.BusyMessage = string.empty;
}
}
busyIndicator 与IsBusy 和BusyMessage 绑定。
执行此代码时,我确实得到了显示“Init...”的busyIndicator,但它永远不会更改为“正在检索数据...”或“正在搜索。 ..”。
更糟糕的是:在执行最终的GetData3 时,用户界面完全冻结。
【问题讨论】:
-
这些方法有什么作用?它们真的是异步的吗?
-
在调试器冻结时暂停它并查看堆栈跟踪。
-
这段代码是否在事件处理程序中被调用?该处理程序是否标记为异步?
-
我认为 finally-block 将在第一个 await 中断 方法时被调用。这可能会产生一些副作用。你能在 finally 块上放一个断点吗?
-
@Baldrick 此代码在我的视图模型中绑定到按钮的方法中。
标签: c# wpf async-await