0

我有一堂课

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

我在 C# 代码中使用这个类

但我想保持我的代码执行直到message属性为空。

我有一种不同的方法,在一段时间后填充属性,这取决于用户,它可以在 2 秒或 2 分钟内填充。但是,一旦用户填写了消息,我就需要在它所在的位置执行。

我可以在其中使用 while 但我只想使用TaskCompletionSource.

4

2 回答 2

1

让我们分解你的问题。您想观察 的值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.Reactivefor the logic。

 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();
 }
于 2019-04-30T07:14:24.750 回答
0

你可以使用 C# - 多线程属性来保持执行

访问这里了解如何:https ://www.tutorialspoint.com/csharp/csharp_multithreading.htm

于 2019-04-30T04:30:36.993 回答