.NET 异步并发操作,只保留最后一次操作

【声明】优快云只做转发不做时时更新,最新博客请关注博客园 .NET 异步并发操作,只保留最后一次操作 - 唐宋元明清2188 - 博客园 (cnblogs.com)

在我们业务操作时,难免会有多次操作,我们期望什么结果呢?

绝大部分情况,应该是只需要最后一次操作的结果,其它操作应该无效。

自定义等待的任务类

1. 可等待的任务类 AwaitableTask:

  1     /// <summary>
  2     /// 可等待的任务
  3     /// </summary>
  4     public class AwaitableTask
  5     {
  6         /// <summary>
  7         /// 获取任务是否为不可执行状态
  8         /// </summary>
  9         public bool NotExecutable { get; private set; }
 10 
 11         /// <summary>
 12         /// 设置任务不可执行
 13         /// </summary>
 14         public void SetNotExecutable()
 15         {
 16             NotExecutable = true;
 17         }
 18 
 19         /// <summary>
 20         /// 获取任务是否有效
 21         /// 注:对无效任务,可以不做处理。减少并发操作导致的干扰
 22         /// </summary>
 23         public bool IsInvalid { get; private set; } = true;
 24 
 25         /// <summary>
 26         /// 标记任务无效
 27         /// </summary>
 28         public void MarkTaskValid()
 29         {
 30             IsInvalid = false;
 31         }
 32 
 33         #region Task
 34 
 35         private readonly Task _task;
 36         /// <summary>
 37         /// 初始化可等待的任务。
 38         /// </summary>
 39         /// <param name="task"></param>
 40         public AwaitableTask(Task task) => _task = task;
 41 
 42         /// <summary>
 43         /// 获取任务是否已完成
 44         /// </summary>
 45         public bool IsCompleted => _task.IsCompleted;
 46 
 47         /// <summary>
 48         /// 任务的Id
 49         /// </summary>
 50         public int TaskId => _task.Id;
 51 
 52         /// <summary>
 53         /// 开始任务
 54         /// </summary>
 55         public void Start() => _task.Start();
 56 
 57         /// <summary>
 58         /// 同步执行开始任务
 59         /// </summary>
 60         public void RunSynchronously() => _task.RunSynchronously();
 61 
 62         #endregion
 63 
 64         #region TaskAwaiter
 65 
 66         /// <summary>
 67         /// 获取任务等待器
 68         /// </summary>
 69         /// <returns></returns>
 70         public TaskAwaiter GetAwaiter() => new TaskAwaiter(this);
 71 
 72         /// <summary>Provides an object that waits for the completion of an asynchronous task. </summary>
 73         [HostProtection(SecurityAction.LinkDemand, ExternalThreading = true, Synchronization = true)]
 74         public struct TaskAwaiter : INotifyCompletion
 75         {
 76             private readonly AwaitableTask _task;
 77 
 78             /// <summary>
 79             /// 任务等待器
 80             /// </summary>
 81             /// <param name="awaitableTask"></param>
 82             public TaskAwaiter(AwaitableTask awaitableTask) => _task = awaitableTask;
 83 
 84             /// <summary>
 85             /// 任务是否完成.
 86             /// </summary>
 87             public bool IsCompleted => _task._task.IsCompleted;
 88 
 89             /// <inheritdoc />
 90             public void OnCompleted(Action continuation)
 91             {
 92                 var This = this;
 93                 _task._task.ContinueWith(t =>
 94                 {
 95                     if (!This._task.NotExecutable) continuation?.Invoke();
 96                 });
 97             }
 98             /// <summary>
 99             /// 获取任务结果
100             /// </summary>
101             public void GetResult() => _task._task.Wait();
102         }
103 
104         #endregion
105 
106  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值