Task的Wait(...)方法重载与CancellationTokenSource任务取消; Task ContinueWith方法()

//任务的Wait方法;

//模拟一个执行时间为5STask任务,因为任务是异步的,所以不阻塞主线程

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;
 

  • 12
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值