root / trunk / Pithos.Core / Agents / AsyncAutoResetEvent.cs @ 79f92570
History | View | Annotate | Download (1.6 kB)
1 | 79f92570 | Panagiotis Kanavos | // ----------------------------------------------------------------------- |
---|---|---|---|
2 | 79f92570 | Panagiotis Kanavos | // <copyright file="AsyncAutoResetEvent.cs" company="Microsoft"> |
3 | 79f92570 | Panagiotis Kanavos | // TODO: Update copyright text. |
4 | 79f92570 | Panagiotis Kanavos | // </copyright> |
5 | 79f92570 | Panagiotis Kanavos | // ----------------------------------------------------------------------- |
6 | 79f92570 | Panagiotis Kanavos | |
7 | 79f92570 | Panagiotis Kanavos | using System.Threading.Tasks; |
8 | 79f92570 | Panagiotis Kanavos | |
9 | 79f92570 | Panagiotis Kanavos | namespace Pithos.Core.Agents |
10 | 79f92570 | Panagiotis Kanavos | { |
11 | 79f92570 | Panagiotis Kanavos | using System; |
12 | 79f92570 | Panagiotis Kanavos | using System.Collections.Generic; |
13 | 79f92570 | Panagiotis Kanavos | using System.Linq; |
14 | 79f92570 | Panagiotis Kanavos | using System.Text; |
15 | 79f92570 | Panagiotis Kanavos | |
16 | 79f92570 | Panagiotis Kanavos | /// <summary> |
17 | 79f92570 | Panagiotis Kanavos | /// TODO: Update summary. |
18 | 79f92570 | Panagiotis Kanavos | /// </summary> |
19 | 79f92570 | Panagiotis Kanavos | public class AsyncAutoResetEvent |
20 | 79f92570 | Panagiotis Kanavos | { |
21 | 79f92570 | Panagiotis Kanavos | private readonly static Task Completed = TaskEx.FromResult(true); |
22 | 79f92570 | Panagiotis Kanavos | private readonly Queue<TaskCompletionSource<bool>> _waits = new Queue<TaskCompletionSource<bool>>(); |
23 | 79f92570 | Panagiotis Kanavos | private bool _signaled; |
24 | 79f92570 | Panagiotis Kanavos | |
25 | 79f92570 | Panagiotis Kanavos | public Task WaitAsync() |
26 | 79f92570 | Panagiotis Kanavos | { |
27 | 79f92570 | Panagiotis Kanavos | lock (_waits) |
28 | 79f92570 | Panagiotis Kanavos | { |
29 | 79f92570 | Panagiotis Kanavos | if (_signaled) |
30 | 79f92570 | Panagiotis Kanavos | { |
31 | 79f92570 | Panagiotis Kanavos | _signaled = false; |
32 | 79f92570 | Panagiotis Kanavos | return Completed; |
33 | 79f92570 | Panagiotis Kanavos | } |
34 | 79f92570 | Panagiotis Kanavos | else |
35 | 79f92570 | Panagiotis Kanavos | { |
36 | 79f92570 | Panagiotis Kanavos | var tcs = new TaskCompletionSource<bool>(); |
37 | 79f92570 | Panagiotis Kanavos | _waits.Enqueue(tcs); |
38 | 79f92570 | Panagiotis Kanavos | return tcs.Task; |
39 | 79f92570 | Panagiotis Kanavos | } |
40 | 79f92570 | Panagiotis Kanavos | } |
41 | 79f92570 | Panagiotis Kanavos | } |
42 | 79f92570 | Panagiotis Kanavos | |
43 | 79f92570 | Panagiotis Kanavos | public void Set() |
44 | 79f92570 | Panagiotis Kanavos | { |
45 | 79f92570 | Panagiotis Kanavos | TaskCompletionSource<bool> toRelease = null; |
46 | 79f92570 | Panagiotis Kanavos | lock (_waits) |
47 | 79f92570 | Panagiotis Kanavos | { |
48 | 79f92570 | Panagiotis Kanavos | if (_waits.Count > 0) |
49 | 79f92570 | Panagiotis Kanavos | toRelease = _waits.Dequeue(); |
50 | 79f92570 | Panagiotis Kanavos | else if (!_signaled) |
51 | 79f92570 | Panagiotis Kanavos | _signaled = true; |
52 | 79f92570 | Panagiotis Kanavos | } |
53 | 79f92570 | Panagiotis Kanavos | if (toRelease != null) |
54 | 79f92570 | Panagiotis Kanavos | toRelease.SetResult(true); |
55 | 79f92570 | Panagiotis Kanavos | } |
56 | 79f92570 | Panagiotis Kanavos | |
57 | 79f92570 | Panagiotis Kanavos | } |
58 | 79f92570 | Panagiotis Kanavos | } |