【发布时间】:2015-10-25 08:15:36
【问题描述】:
这是针对用Xamarin 编写的iOS 应用程序。我所有的应用程序代码都在主线程中运行(即UI thread)。
UI 代码执行如下操作:
public async void ButtonClicked()
{
StartSpinner();
var data = await UpdateData();
StopSpinner();
UpdateScreen(data);
}
UpdateData 函数的作用如下:
public Task<Data> UpdateData()
{
var data = await FetchFromServer();
TriggerCacheUpdate();
return data;
}
TriggerCacheUpdate 最终调用下面定义的函数
public Task RefreshCache()
{
var data = await FetchMoreDataFromServer();
UpdateInternalDataStructures();
}
我的问题是TriggerCacheUpdate 应该怎么写?要求是:
- 不能异步,我不想要
UpdateData,因此ButtonClicked等待RefreshCache完成之前 继续。 -
UpdateInternalDataStructures需要在主 (UI) 线程上执行,即上面显示的所有其他代码执行的线程。
以下是我想出的一些替代方案:
public void TriggerCacheUpdate()
{
RefreshCache();
}
上述方法有效,但会生成编译器警告。此外,来自RefreshCache 的异常处理不起作用。
public void TriggerCacheUpdate()
{
Task.Run(async() =>
{
await RefreshCache();
});
}
以上内容违反了要求 2,因为 UpdateInternalDataStructures 未与其他所有内容在同一线程上执行。
我认为可行的一种可能的替代方法是:
private event EventHandler Done;
public void TriggerCacheUpdate()
{
this.task = RefreshCache();
Done += async(sender, e) => await this.task;
}
Task RefreshCache() {
var data = await FetchMoreDataFromServer();
UpdateInternalDataStructures();
if (Done != null) {
Done(this, EventArgs.Empty);
}
}
上述方法有效吗?到目前为止,我的有限测试没有遇到任何问题。有没有更好的写法TriggerCacheUpdate?
【问题讨论】:
-
为什么会被否决?如果问题不清楚,请添加评论。
标签: c# .net xamarin.ios async-await