我有一堂课
Public class DDSModel
{
public string message {get; set;}
}
我在 C# 代码中使用这个类
但我想保持我的代码执行直到message
属性为空。
我有一种不同的方法,在一段时间后填充属性,这取决于用户,它可以在 2 秒或 2 分钟内填充。但是,一旦用户填写了消息,我就需要在它所在的位置执行。
我可以在其中使用 while 但我只想使用TaskCompletionSource
.
我有一堂课
Public class DDSModel
{
public string message {get; set;}
}
我在 C# 代码中使用这个类
但我想保持我的代码执行直到message
属性为空。
我有一种不同的方法,在一段时间后填充属性,这取决于用户,它可以在 2 秒或 2 分钟内填充。但是,一旦用户填写了消息,我就需要在它所在的位置执行。
我可以在其中使用 while 但我只想使用TaskCompletionSource
.
让我们分解你的问题。您想观察 的值DDSModel.message
,并等到该值具有 的值null
,然后对其做出反应,全部使用Task
。
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
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();
}
你可以使用 C# - 多线程属性来保持执行
访问这里了解如何:https ://www.tutorialspoint.com/csharp/csharp_multithreading.htm