我有一个视图模型,它正在获取一行记录并在Windows手机UI上显示。 这个获取数据的视图模型方法使用了许多带有Await的Tasks。
看起来如下:
async Task GetData()
{
var dataCollection = await GetSomeData();
await DoThis();
await DoThat();
}
在调用“DoThis”后,UI会刷新。 现在我发现,在其他任务完成之前,在代码中引入Task.Delay,UI会立即刷新。这就是我的原始目标,即在“GetSomeData”返回后立即刷新UI,然后再启动其他任务。
如下所示:
async Task GetData()
{
var dataCollection = await GetSomeData();
await Task.Delay(100);
await DoThis();
await DoThat();
}
根据我的理解,通过调用Task.Delay之后,UI线程有机会进行刷新。但是如果没有调用Task.Delay,在DoThis方法被调用时,在找到第一个可等待的方法以便可以返回并继续UI刷新之前,会有一些时间的延迟。
我的问题是:
- 我理解得对吗?
- 这样在生产环境中使用安全吗?
感谢您的提前回答,希望我表述清楚了。
以下是这些方法的详细信息,因为没有这些信息,不能清楚地了解程序运行的情况... :(
async Task<ObservableCollection<MyModel>> GetSomeData()
{
return await Task.Run(() =>
{
using (var db = new MainModelDataContext())
{
List<MyModel> temp =
db.Models.Where(Some condition)
.Take(30)
.ToList();
var returnCollection = new ObservableCollection<MyModel>(temp);
return returnCollection;
}
}
ObservableCollection(可观察集合)绑定在 UI 页面的列表控件上。这个方法是由页面视图模型调用的。
async Task DoThis()
{
// do some data processing and then post that to the Server
// this is the first awaitable method after the data processing
await (an HttpClientHandler).PostAsync();
}
任务DoThat()的流程与DoThis()相同。数据处理也使用async-await任务包装,并且它们仅在一些类属性上工作。
希望我表达清楚了。再次感谢大家。
DoThis()
和DoThat()
是做什么的?听起来它们是有效的同步代码,可能不应该在UI线程上运行... - Jon SkeetTask.Delay
的调用只是给UI线程一个运行的机会。 - Daniel KelleyGetSomeData
和DoThis
方法。我假设它们内部正在运行长时间的同步操作。 - Yuval Itzchakovawait
,否则该代码将无法编译。您为什么要等待Task.Run
的返回值呢?为什么不直接声明一个返回任务的非异步方法呢?这种包装没有帮助... - Jon Skeet