44
55using System ;
66using System . Collections . Generic ;
7+ using System . Linq ;
78using System . Threading . Tasks ;
89using Microsoft . Toolkit . Mvvm . Messaging ;
910using Microsoft . Toolkit . Mvvm . Messaging . Messages ;
@@ -73,6 +74,8 @@ void Receive(object recipient, NumberRequestMessage m)
7374 messenger . Register < NumberRequestMessage > ( recipient , Receive ) ;
7475
7576 int result = messenger . Send < NumberRequestMessage > ( ) ;
77+
78+ GC . KeepAlive ( recipient ) ;
7679 }
7780
7881 public class NumberRequestMessage : RequestMessage < int >
@@ -102,6 +105,8 @@ void Receive(object recipient, AsyncNumberRequestMessage m)
102105 int result = await messenger . Send < AsyncNumberRequestMessage > ( ) ;
103106
104107 Assert . AreEqual ( result , 42 ) ;
108+
109+ GC . KeepAlive ( recipient ) ;
105110 }
106111
107112 [ TestCategory ( "Mvvm" ) ]
@@ -134,6 +139,8 @@ void Receive(object recipient, AsyncNumberRequestMessage m)
134139 int result = await messenger . Send < AsyncNumberRequestMessage > ( ) ;
135140
136141 Assert . AreEqual ( result , 42 ) ;
142+
143+ GC . KeepAlive ( recipient ) ;
137144 }
138145
139146 [ TestCategory ( "Mvvm" ) ]
@@ -167,6 +174,8 @@ void Receive(object recipient, AsyncNumberRequestMessage m)
167174 messenger . Register < AsyncNumberRequestMessage > ( recipient , Receive ) ;
168175
169176 int result = await messenger . Send < AsyncNumberRequestMessage > ( ) ;
177+
178+ GC . KeepAlive ( recipient ) ;
170179 }
171180
172181 public class AsyncNumberRequestMessage : AsyncRequestMessage < int >
@@ -191,6 +200,8 @@ void Receive(object recipient, NumbersCollectionRequestMessage m)
191200 var results = messenger . Send < NumbersCollectionRequestMessage > ( ) . Responses ;
192201
193202 Assert . AreEqual ( results . Count , 0 ) ;
203+
204+ GC . KeepAlive ( recipient ) ;
194205 }
195206
196207 [ TestCategory ( "Mvvm" ) ]
@@ -266,6 +277,8 @@ void Receive(object recipient, AsyncNumbersCollectionRequestMessage m)
266277 var results = await messenger . Send < AsyncNumbersCollectionRequestMessage > ( ) . GetResponsesAsync ( ) ;
267278
268279 Assert . AreEqual ( results . Count , 0 ) ;
280+
281+ GC . KeepAlive ( recipient ) ;
269282 }
270283
271284 [ TestCategory ( "Mvvm" ) ]
@@ -298,6 +311,46 @@ async Task<int> GetNumberAsync()
298311 messenger . Register < AsyncNumbersCollectionRequestMessage > ( recipient3 , Receive3 ) ;
299312 messenger . Register < AsyncNumbersCollectionRequestMessage > ( recipient4 , Receive4 ) ;
300313
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+
301354 List < int > responses = new List < int > ( ) ;
302355
303356 await foreach ( var response in messenger . Send < AsyncNumbersCollectionRequestMessage > ( ) )
@@ -306,6 +359,11 @@ async Task<int> GetNumberAsync()
306359 }
307360
308361 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 ) ;
309367 }
310368
311369 public class AsyncNumbersCollectionRequestMessage : AsyncCollectionRequestMessage < int >
0 commit comments