4
4
5
5
using System ;
6
6
using System . Collections . Generic ;
7
+ using System . Linq ;
7
8
using System . Threading . Tasks ;
8
9
using Microsoft . Toolkit . Mvvm . Messaging ;
9
10
using Microsoft . Toolkit . Mvvm . Messaging . Messages ;
@@ -73,6 +74,8 @@ void Receive(object recipient, NumberRequestMessage m)
73
74
messenger . Register < NumberRequestMessage > ( recipient , Receive ) ;
74
75
75
76
int result = messenger . Send < NumberRequestMessage > ( ) ;
77
+
78
+ GC . KeepAlive ( recipient ) ;
76
79
}
77
80
78
81
public class NumberRequestMessage : RequestMessage < int >
@@ -102,6 +105,8 @@ void Receive(object recipient, AsyncNumberRequestMessage m)
102
105
int result = await messenger . Send < AsyncNumberRequestMessage > ( ) ;
103
106
104
107
Assert . AreEqual ( result , 42 ) ;
108
+
109
+ GC . KeepAlive ( recipient ) ;
105
110
}
106
111
107
112
[ TestCategory ( "Mvvm" ) ]
@@ -134,6 +139,8 @@ void Receive(object recipient, AsyncNumberRequestMessage m)
134
139
int result = await messenger . Send < AsyncNumberRequestMessage > ( ) ;
135
140
136
141
Assert . AreEqual ( result , 42 ) ;
142
+
143
+ GC . KeepAlive ( recipient ) ;
137
144
}
138
145
139
146
[ TestCategory ( "Mvvm" ) ]
@@ -167,6 +174,8 @@ void Receive(object recipient, AsyncNumberRequestMessage m)
167
174
messenger . Register < AsyncNumberRequestMessage > ( recipient , Receive ) ;
168
175
169
176
int result = await messenger . Send < AsyncNumberRequestMessage > ( ) ;
177
+
178
+ GC . KeepAlive ( recipient ) ;
170
179
}
171
180
172
181
public class AsyncNumberRequestMessage : AsyncRequestMessage < int >
@@ -191,6 +200,8 @@ void Receive(object recipient, NumbersCollectionRequestMessage m)
191
200
var results = messenger . Send < NumbersCollectionRequestMessage > ( ) . Responses ;
192
201
193
202
Assert . AreEqual ( results . Count , 0 ) ;
203
+
204
+ GC . KeepAlive ( recipient ) ;
194
205
}
195
206
196
207
[ TestCategory ( "Mvvm" ) ]
@@ -266,6 +277,8 @@ void Receive(object recipient, AsyncNumbersCollectionRequestMessage m)
266
277
var results = await messenger . Send < AsyncNumbersCollectionRequestMessage > ( ) . GetResponsesAsync ( ) ;
267
278
268
279
Assert . AreEqual ( results . Count , 0 ) ;
280
+
281
+ GC . KeepAlive ( recipient ) ;
269
282
}
270
283
271
284
[ TestCategory ( "Mvvm" ) ]
@@ -298,6 +311,46 @@ async Task<int> GetNumberAsync()
298
311
messenger . Register < AsyncNumbersCollectionRequestMessage > ( recipient3 , Receive3 ) ;
299
312
messenger . Register < AsyncNumbersCollectionRequestMessage > ( recipient4 , Receive4 ) ;
300
313
314
+ var responses = await messenger . Send < AsyncNumbersCollectionRequestMessage > ( ) . GetResponsesAsync ( ) ;
315
+
316
+ CollectionAssert . AreEquivalent ( responses . ToArray ( ) , new [ ] { 1 , 2 , 3 , 3 } ) ;
317
+
318
+ GC . KeepAlive ( recipient1 ) ;
319
+ GC . KeepAlive ( recipient2 ) ;
320
+ GC . KeepAlive ( recipient3 ) ;
321
+ GC . KeepAlive ( recipient4 ) ;
322
+ }
323
+
324
+ [ TestCategory ( "Mvvm" ) ]
325
+ [ TestMethod ]
326
+ [ DataRow ( typeof ( StrongReferenceMessenger ) ) ]
327
+ [ DataRow ( typeof ( WeakReferenceMessenger ) ) ]
328
+ public async Task Test_Messenger_AsyncCollectionRequestMessage_Ok_MultipleReplies_Enumerate ( Type type )
329
+ {
330
+ var messenger = ( IMessenger ) Activator . CreateInstance ( type ) ;
331
+ object
332
+ recipient1 = new object ( ) ,
333
+ recipient2 = new object ( ) ,
334
+ recipient3 = new object ( ) ,
335
+ recipient4 = new object ( ) ;
336
+
337
+ async Task < int > GetNumberAsync ( )
338
+ {
339
+ await Task . Delay ( 100 ) ;
340
+
341
+ return 3 ;
342
+ }
343
+
344
+ void Receive1 ( object recipient , AsyncNumbersCollectionRequestMessage m ) => m . Reply ( 1 ) ;
345
+ void Receive2 ( object recipient , AsyncNumbersCollectionRequestMessage m ) => m . Reply ( Task . FromResult ( 2 ) ) ;
346
+ void Receive3 ( object recipient , AsyncNumbersCollectionRequestMessage m ) => m . Reply ( GetNumberAsync ( ) ) ;
347
+ void Receive4 ( object recipient , AsyncNumbersCollectionRequestMessage m ) => m . Reply ( _ => GetNumberAsync ( ) ) ;
348
+
349
+ messenger . Register < AsyncNumbersCollectionRequestMessage > ( recipient1 , Receive1 ) ;
350
+ messenger . Register < AsyncNumbersCollectionRequestMessage > ( recipient2 , Receive2 ) ;
351
+ messenger . Register < AsyncNumbersCollectionRequestMessage > ( recipient3 , Receive3 ) ;
352
+ messenger . Register < AsyncNumbersCollectionRequestMessage > ( recipient4 , Receive4 ) ;
353
+
301
354
List < int > responses = new List < int > ( ) ;
302
355
303
356
await foreach ( var response in messenger . Send < AsyncNumbersCollectionRequestMessage > ( ) )
@@ -306,6 +359,11 @@ async Task<int> GetNumberAsync()
306
359
}
307
360
308
361
CollectionAssert . AreEquivalent ( responses , new [ ] { 1 , 2 , 3 , 3 } ) ;
362
+
363
+ GC . KeepAlive ( recipient1 ) ;
364
+ GC . KeepAlive ( recipient2 ) ;
365
+ GC . KeepAlive ( recipient3 ) ;
366
+ GC . KeepAlive ( recipient4 ) ;
309
367
}
310
368
311
369
public class AsyncNumbersCollectionRequestMessage : AsyncCollectionRequestMessage < int >
0 commit comments