引言:
最近经常想到一句话“纸上得来终觉浅”,不知道有没有朋友有相似的感觉,如果要的话我想应该就要努力充电了。
因为在做东西的时候,要用到异步加载数据,具体功能也就是当加载数据的时候,创建线程异步加载数据,加载完数据后通知UI,关掉页面加载动画。
在查MSDN的时候就看到了延时任务这个名词,于是就试验了一下,果然,用一次就知道是想要的。
名词解释:
在异步编程中,一个异步操作在完成时调用另一个操作并将数据传递到其中的情况非常常见。 传统上,此过程是通过使用回调方法完成的。 continuation tasks.‘ data-guid="d7739a26fc1c252bd40728fc8a0e1e7a">在任务并行库中,“延续任务”提供了同样的功能。 antecedent, when the antecedent finishes.‘ data-guid="6f856bdaf98de82c802beecb86c90cad">延续任务(也简称为“延续”)是一个异步任务,由另一个任务(称为前面的任务)在完成时调用。”
antecedent, when the antecedent finishes.‘ data-guid="6f856bdaf98de82c802beecb86c90cad">尽管延续相对容易使用,但也十分强大和灵活。 例如,您可以
将数据从前面的任务传递到延续
指定将调用或不调用延续所依据的精确条件
在延续启动之前取消延续,或在延续正在运行时以协作方式取消延续
提供有关应如何安排延续的提示
从同一前面的任务中调用多个延续
在多个前面的任务中的全部或任一任务完成时调用一个延续
将延续依次相连,形成任意长度
使用延续来处理前面的任务所引发的异常
我们来看一下task这个类:表示一个异步任务,实例有两种创建方式:
Task t1 = new Task(new Action(()=>{}), "alpha");
Task t2 = Task.Factory.StartNew(new Action(()=>{}), "beta");延时任务就是task实例的一个方法,下面我们创建一个异步调用的方法看一下,到底怎么样:
private void BeginInvoke(Action action, Action<Task> complated)
{
Task task = new Task(action);
if (complated != null)
{
task.ContinueWith(complated);
}
task.Start();
}
先看一下方法内的参数,第一个是一个无参数无返回值的委托,而第二个则是一个有参数无返回值的委托。
这里我是想要在第一个方法执行完后执行第二个方法,于是第一行我们创建了一个Task实例,并给实例指定了一个调用的方法,然后我们就可以用task.ContinueWith(complated)把第二个方法,也可以说成延时任务,因为它会在执行完前一个任务后执行这个任务。并且会把当前任务的引用将以参数的形式传给延时任务,我们看一下如何传递
private void complated(Task task)
{
if (task.IsCompleted)
//在当前线程获取主线程的UI元素
this.Dispatcher.BeginInvoke(new Action(() => { this.ucLoading.Visibility = Visibility.Collapsed;}));
}
Invoke or BeginInvoke. Invoke is synchronous and BeginInvoke is asynchronous.‘ data-guid="a2af272f85052454fb19e30f9945594b">该操作将按指定的DispatherPriority添加到Dispather的队列中,我么知道DispatcherObject can only be accessed by the Dispatcher it is associated with.‘ data-guid="e057570ed3dde32670dc4d7b5b5ab8d7">DispatcherObject是一个很底层的类,很多类都继承自这个类,比如Button等,那么我们想要在UI线程外的线程访问这些UI控件,就要用到Dispather这个类,用它与UI线程交互。
antecedent, when the antecedent finishes.‘ data-guid="6f856bdaf98de82c802beecb86c90cad">
原文:http://www.cnblogs.com/wywnet/p/3531583.html