Let's break down your problem. You want to watch the value of DDSModel.message
, and wait until the value has a value of null
, then react to it, all using Task
.
- You want to be able to watch the value of
DDSModel.message
Do
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(); }
}
}
Then you can do:
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;
}
However if you want cleaner code, I would recommend using System.Reactive
for 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();
}