Необходимо удерживать выполнение кода до тех пор, пока свойство не станет пустым с помощью TaskCompletionSource - PullRequest
0 голосов
/ 30 апреля 2019

У меня есть класс

Public class DDSModel
{
   public string message {get; set;}
}

Я использую этот класс в коде c #

но я хочу приостановить выполнение кода, пока свойство message не станет пустым.

У меня есть другой метод, который заполняет свойство через некоторое время, это зависит от пользователя, его можно заполнить через 2 секунды или 2 минуты. Но как только пользователь заполняет сообщение, мне нужно выполнить его, где оно было удержано.

Я могу использовать пока в этом, но я просто хочу использовать TaskCompletionSource.

Ответы [ 2 ]

1 голос
/ 30 апреля 2019

Давайте разберем вашу проблему. Вы хотите посмотреть значение DDSModel.message и подождать, пока значение не будет иметь значение null, а затем отреагировать на него, используя Task.

  1. Вы хотите, чтобы иметь возможность смотреть значение DDSModel.message

У

 public class DDSModel : INotifyPropertyChanged
 {
     public event PropertyChangedEventHandler PropertyChanged;
     protected void OnPropertyChanged([CallerMemberName] string property)
     {
          PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
     }

     private string _message;
     public string Message
     {
         get { return _message; }
         set { _message = value; OnPropertyChanged(); }
     }
 }

Тогда вы можете сделать:

 public Task WaitUntilMessageIsNull(model DDSModel)
 {
     var tcs = new TaskCompletionSource<int>();
     PropertyChangedEventHandler handler = (o, e) => {
         if(model.Message == null && e.PropertyName == "Message")
         {
            tcs.SetResult(0);
            model.PropertyChanged -= handler;
         }
     }
     model.PropertyChanged += handler;
     return tcs.Task;

 }

Однако, если вы хотите более чистый код, я бы рекомендовал использовать System.Reactive для логики.

 public Task WaitUntilMessageIsNull(model DDSModel)
 {
     return Observable
            .FromEventPattern<PropertyChangedEventHandler, PropertyChangedEventArgs>(
                h => model.propertyChanged += h,
                h => model.propertyChanged -= h)
            .Where(x => x.EventArgs.PropertyName == "Message")
            .Where(_ => model.Message == null)
            .ToTask();
 }
0 голосов
/ 30 апреля 2019

вы можете использовать C # - многопоточность для хранения исполнения

Посетите здесь, чтобы узнать, как: https://www.tutorialspoint.com/csharp/csharp_multithreading.htm

...