【声明】CSDN只做转发不做时时更新,最新博客请关注博客园 .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
10

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



