PRE*_*PRE 1 .net c# task-parallel-library async-await
我有一个视图模型,它获取一行记录并显示在Windows手机UI上.这个获取数据的视图模型方法正在执行大量任务,所有任务都标有Await操作.
如下所示:
async Task GetData()
{
var dataCollection = await GetSomeData();
await DoThis();
await DoThat();
}
Run Code Online (Sandbox Code Playgroud)
调用'DoThis'调用后,UI会刷新.现在我只是观察到如果我在其他任务完成之前在代码中引入了Task.Delay,则会立即刷新UI.这是我的原始目标,在'GetSomeData'返回后立即刷新UI然后触发其他任务.
如下所示:
async Task GetData()
{
var dataCollection = await GetSomeData();
await Task.Delay(100);
await DoThis();
await DoThat();
}
Run Code Online (Sandbox Code Playgroud)
所以我从中理解的是,在调用Task.Delay之后,UI线程有机会刷新.但是如果没有Task.Delay,如果调用DoThis,在找到'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;
}
}
Run Code Online (Sandbox Code Playgroud)
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();
}
Run Code Online (Sandbox Code Playgroud)
任务DoThat()也遵循与DoThis相同的流程.数据处理也包含在async-await Tasks中,它们只是在处理某些类属性.
希望我很清楚..再次感谢所有人
当您调用时Task.Delay
,将控制权返回给UI消息循环100毫秒,并且UI消息循环有机会从其队列中处理更多消息.这就是为什么你会体验到"令人耳目一新"的效果.如果您的GetSomeData
方法是真正异步的,那么您的UI应该在其操作期间保持响应,并且当它完成时,它将继续执行下一个await
.
如果没有发生这种影响,那么这意味着你的方法实际上并不是异步的,并且它们更有可能以同步的方式运行代价高昂的操作,阻塞你的UI线程.
在将其投入生产之前,您必须了解为什么需要Task.Delay
刷新UI.
归档时间: |
|
查看次数: |
1142 次 |
最近记录: |