@@ -22,66 +22,90 @@ public class MemoryPersistenceProvider : IPersistenceProvider
22
22
23
23
public async Task < string > CreateNewWorkflow ( WorkflowInstance workflow )
24
24
{
25
- workflow . Id = Guid . NewGuid ( ) . ToString ( ) ;
26
- _instances . Add ( workflow ) ;
27
- return workflow . Id ;
25
+ lock ( _instances )
26
+ {
27
+ workflow . Id = Guid . NewGuid ( ) . ToString ( ) ;
28
+ _instances . Add ( workflow ) ;
29
+ return workflow . Id ;
30
+ }
28
31
}
29
32
30
33
public async Task PersistWorkflow ( WorkflowInstance workflow )
31
34
{
32
- var existing = _instances . First ( x => x . Id == workflow . Id ) ;
33
- _instances . Remove ( existing ) ;
34
- _instances . Add ( workflow ) ;
35
+ lock ( _instances )
36
+ {
37
+ var existing = _instances . First ( x => x . Id == workflow . Id ) ;
38
+ _instances . Remove ( existing ) ;
39
+ _instances . Add ( workflow ) ;
40
+ }
35
41
}
36
42
37
43
public async Task < IEnumerable < string > > GetRunnableInstances ( )
38
44
{
39
- var now = DateTime . Now . ToUniversalTime ( ) . Ticks ;
40
- return _instances . Where ( x => x . NextExecution . HasValue && x . NextExecution <= now ) . Select ( x => x . Id ) ;
45
+ lock ( _instances )
46
+ {
47
+ var now = DateTime . Now . ToUniversalTime ( ) . Ticks ;
48
+ return _instances . Where ( x => x . NextExecution . HasValue && x . NextExecution <= now ) . Select ( x => x . Id ) ;
49
+ }
41
50
}
42
51
43
52
public async Task < WorkflowInstance > GetWorkflowInstance ( string Id )
44
53
{
45
- return _instances . First ( x => x . Id == Id ) ;
54
+ lock ( _instances )
55
+ {
56
+ return _instances . First ( x => x . Id == Id ) ;
57
+ }
46
58
}
47
59
48
60
public async Task < IEnumerable < WorkflowInstance > > GetWorkflowInstances ( WorkflowStatus ? status , string type , DateTime ? createdFrom , DateTime ? createdTo , int skip , int take )
49
61
{
50
- var result = _instances . AsQueryable ( ) ;
62
+ lock ( _instances )
63
+ {
64
+ var result = _instances . AsQueryable ( ) ;
51
65
52
- if ( status . HasValue )
53
- result = result . Where ( x => x . Status == status . Value ) ;
66
+ if ( status . HasValue )
67
+ result = result . Where ( x => x . Status == status . Value ) ;
54
68
55
- if ( ! String . IsNullOrEmpty ( type ) )
56
- result = result . Where ( x => x . WorkflowDefinitionId == type ) ;
69
+ if ( ! String . IsNullOrEmpty ( type ) )
70
+ result = result . Where ( x => x . WorkflowDefinitionId == type ) ;
57
71
58
- if ( createdFrom . HasValue )
59
- result = result . Where ( x => x . CreateTime >= createdFrom . Value ) ;
72
+ if ( createdFrom . HasValue )
73
+ result = result . Where ( x => x . CreateTime >= createdFrom . Value ) ;
60
74
61
- if ( createdTo . HasValue )
62
- result = result . Where ( x => x . CreateTime <= createdTo . Value ) ;
75
+ if ( createdTo . HasValue )
76
+ result = result . Where ( x => x . CreateTime <= createdTo . Value ) ;
63
77
64
- return result . Skip ( skip ) . Take ( take ) . ToList ( ) ;
78
+ return result . Skip ( skip ) . Take ( take ) . ToList ( ) ;
79
+ }
65
80
}
66
81
67
82
68
83
public async Task < string > CreateEventSubscription ( EventSubscription subscription )
69
84
{
70
- subscription . Id = Guid . NewGuid ( ) . ToString ( ) ;
71
- _subscriptions . Add ( subscription ) ;
72
- return subscription . Id ;
85
+ lock ( _subscriptions )
86
+ {
87
+ subscription . Id = Guid . NewGuid ( ) . ToString ( ) ;
88
+ _subscriptions . Add ( subscription ) ;
89
+ return subscription . Id ;
90
+ }
73
91
}
74
92
75
93
public async Task < IEnumerable < EventSubscription > > GetSubcriptions ( string eventName , string eventKey , DateTime asOf )
76
94
{
77
- return _subscriptions
78
- . Where ( x => x . EventName == eventName && x . EventKey == eventKey && x . SubscribeAsOf <= asOf ) ;
95
+ lock ( _subscriptions )
96
+ {
97
+ return _subscriptions
98
+ . Where ( x => x . EventName == eventName && x . EventKey == eventKey && x . SubscribeAsOf <= asOf ) ;
99
+ }
79
100
}
80
101
81
102
public async Task TerminateSubscription ( string eventSubscriptionId )
82
103
{
83
- var sub = _subscriptions . Single ( x => x . Id == eventSubscriptionId ) ;
84
- _subscriptions . Remove ( sub ) ;
104
+ lock ( _subscriptions )
105
+ {
106
+ var sub = _subscriptions . Single ( x => x . Id == eventSubscriptionId ) ;
107
+ _subscriptions . Remove ( sub ) ;
108
+ }
85
109
}
86
110
87
111
public void EnsureStoreExists ( )
@@ -90,51 +114,72 @@ public void EnsureStoreExists()
90
114
91
115
public async Task < string > CreateEvent ( Event newEvent )
92
116
{
93
- newEvent . Id = Guid . NewGuid ( ) . ToString ( ) ;
94
- _events . Add ( newEvent ) ;
95
- return newEvent . Id ;
117
+ lock ( _events )
118
+ {
119
+ newEvent . Id = Guid . NewGuid ( ) . ToString ( ) ;
120
+ _events . Add ( newEvent ) ;
121
+ return newEvent . Id ;
122
+ }
96
123
}
97
124
98
125
public async Task MarkEventProcessed ( string id )
99
126
{
100
- var evt = _events . FirstOrDefault ( x => x . Id == id ) ;
101
- if ( evt != null )
102
- evt . IsProcessed = true ;
127
+ lock ( _events )
128
+ {
129
+ var evt = _events . FirstOrDefault ( x => x . Id == id ) ;
130
+ if ( evt != null )
131
+ evt . IsProcessed = true ;
132
+ }
103
133
}
104
134
105
135
public async Task < IEnumerable < string > > GetRunnableEvents ( )
106
136
{
107
- return _events
108
- . Where ( x => ! x . IsProcessed )
109
- . Where ( x => x . EventTime <= DateTime . Now . ToUniversalTime ( ) )
110
- . Select ( x => x . Id )
111
- . ToList ( ) ;
137
+ lock ( _events )
138
+ {
139
+ return _events
140
+ . Where ( x => ! x . IsProcessed )
141
+ . Where ( x => x . EventTime <= DateTime . Now . ToUniversalTime ( ) )
142
+ . Select ( x => x . Id )
143
+ . ToList ( ) ;
144
+ }
112
145
}
113
146
114
147
public async Task < Event > GetEvent ( string id )
115
148
{
116
- return _events . FirstOrDefault ( x => x . Id == id ) ;
149
+ lock ( _events )
150
+ {
151
+ return _events . FirstOrDefault ( x => x . Id == id ) ;
152
+ }
117
153
}
118
154
119
155
public async Task < IEnumerable < string > > GetEvents ( string eventName , string eventKey , DateTime asOf )
120
156
{
121
- return _events
157
+ lock ( _events )
158
+ {
159
+ return _events
122
160
. Where ( x => x . EventName == eventName && x . EventKey == eventKey )
123
161
. Where ( x => x . EventTime >= asOf )
124
162
. Select ( x => x . Id )
125
163
. ToList ( ) ;
164
+ }
126
165
}
127
166
128
167
public async Task MarkEventUnprocessed ( string id )
129
168
{
130
- var evt = _events . FirstOrDefault ( x => x . Id == id ) ;
131
- if ( evt != null )
132
- evt . IsProcessed = false ;
169
+ lock ( _events )
170
+ {
171
+ var evt = _events . FirstOrDefault ( x => x . Id == id ) ;
172
+ if ( evt != null )
173
+ evt . IsProcessed = false ;
174
+ }
133
175
}
134
176
135
177
public async Task PersistErrors ( IEnumerable < ExecutionError > errors )
136
178
{
137
- _errors . AddRange ( errors ) ;
179
+ lock ( errors )
180
+ {
181
+ _errors . AddRange ( errors ) ;
182
+ }
138
183
}
139
184
}
140
185
#pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously
0 commit comments