//任务的Wait方法;
//模拟一个执行时间为5S的Task任务,因为任务是异步的,所以不阻塞主线程
Task t_delay = Task.Delay(5000);
Task.WaitAll(new Task[] { t_delay });
//任务对象的Wait()方法,等待当前任务结束后继续往下执行
Task t_delay001 = Task.Delay(1000);
t_delay001.Wait();
//任务对象的Wait(int millisecondsTimeout)方法,在指定的时间内判断任务是否执行完毕,返回一个布尔值.
//Wait(int millisecondsTimeout)方法仅仅判断任务是否完成,并不会对任务进行任何操作,比如cancel等.3000毫秒检测未完成,第二次检测就是完成状态了(3000*2 > 5000)
Task t_delay2 = Task.Delay(1000);
if (t_delay2.Wait(2000))
{
bool isok = t_delay2.IsCompleted;//true
MessageBox.Show("任务完成");
}
else
{
bool isok = t_delay2.IsCompleted;//false
MessageBox.Show("任务未完成");
}
//任务对象的Wait(TimeSpan timeout)方法,同样是判断任务在指定的时间内是否已完成,之不过参数从毫秒换成了TimeSpan
Task t_delay3 = Task.Delay(3000);
string CompletedString = t_delay3.Wait(TimeSpan.FromMilliseconds(2000)) ? "Completed" : "Not Completed";
Task t_delay = Task.Delay(3000);//创建一个取消标记对象
CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken myToken = cts.Token;//5000毫秒后取消任务
int timeout = 5000;
//cts.CancelAfter(TimeSpan.FromMilliseconds(5000));
cts.CancelAfter(timeout);//cts.Cancel(); 立即取消try
{//等待任务完成,并检测取消标记是否被CTS Cancel.t_delay.Wait(myToken);MessageBox.Show("任务完成;");
}
catch (OperationCanceledException ex)
{MessageBox.Show(ex.Message + "\r\n" + timeout + "毫秒内任务未完成");
}
这段代码使用了Task.Delay方法模拟一个耗时操作,并使用CancellationTokenSource和CancellationToken来实现任务的取消功能。
首先,我们创建了一个CancellationTokenSource对象,cts用于取消任务。
然后,通过cts.Token获取一个CancellationToken对象,token用于在等待任务完成时检测取消标记。
我们创建了一个异步任务task,利用Task.Delay方法模拟一个耗时操作,持续3秒钟。通过传递token作为参数,以便在取消标记被触发时中止任务。
在控制台输出"任务开始执行"。
使用cts.CancelAfter(5000)方法,在5秒钟后取消任务。
在try块中,我们调用task.Wait(token)方法来等待任务完成,并检测取消标记。如果任务成功完成,控制台输出"任务执行完毕"。
如果任务被取消(即取消标记被触发),OperationCanceledException异常会被捕获,控制台输出"任务取消"。
这段代码展示了如何使用CancellationToken来取消异步任务,以及如何在任务被取消时处理相应的逻辑。通过在task.Wait(token)中传递取消标记,我们可以实现任务的取消操作,并在需要时做出相应的处理.
任务的延续,ContinueWith方法:
//模拟一个执行时间为5S的Task任务,因为任务是异步的,所以不阻塞Form1_load线程
Task t_delay = Task.Delay(5000);
//t_delay任务执行完毕后,执行ContinueWith的Func方法:Func<Task,bool>,对应的任务的类型应该是Task<bool>
Task<bool> t_continue = t_delay.ContinueWith(t => {Thread.Sleep(5000);return t.IsCompleted; });
//获取t_continue任务结果,等t_delay任务执行结束后,才会执行t_continue任务,所以获取结果会组赛线程约10s
bool result = t_continue.Result;