Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.
 
 
 

64 wiersze
1.9 KiB

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections.ObjectModel;
  4. using System.Collections.Specialized;
  5. using System.Linq;
  6. using System.Threading;
  7. using System.Threading.Tasks;
  8. using Xunit;
  9. namespace DotNetCore.CAP.Test.Helpers
  10. {
  11. public static class ObservableCollectionExtensions
  12. {
  13. public static async Task WaitOneMessage<T>(this ObservableCollection<T> collection,
  14. CancellationToken cancellationToken)
  15. {
  16. await WaitForMessages(collection,
  17. x => x.Count() == 1,
  18. cancellationToken);
  19. }
  20. public static async Task WaitForMessages<T>(this ObservableCollection<T> collection,
  21. Func<IEnumerable<T>, bool> comparison,
  22. CancellationToken cancellationToken)
  23. {
  24. cancellationToken.ThrowIfCancellationRequested();
  25. var cts = new CancellationTokenSource();
  26. cancellationToken.Register(() => cts.Cancel());
  27. await Task.Run(async () =>
  28. {
  29. void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs args)
  30. {
  31. if (comparison(collection))
  32. {
  33. cts.Cancel();
  34. }
  35. }
  36. collection.CollectionChanged += OnCollectionChanged;
  37. if (collection.Count > 0)
  38. {
  39. OnCollectionChanged(collection, default);
  40. }
  41. try
  42. {
  43. await Task.Delay(-1, cts.Token);
  44. }
  45. catch (TaskCanceledException)
  46. {
  47. }
  48. finally
  49. {
  50. collection.CollectionChanged -= OnCollectionChanged;
  51. }
  52. cancellationToken.ThrowIfCancellationRequested();
  53. }, cancellationToken);
  54. }
  55. }
  56. }