[英]Using await with an event implementing CancelEventArgs
我有一个与此类似的基类:
public abstract class PageBase
{
public PageBase() { }
public Task<object> Refresh(ModelRequirements requirements)
{
// does work of talking to server and getting data
}
private DataStates _dataState;
public DataStates DataState()
{
get { _dataState = value; }
set
{
var e = new DataStateChangingEventArgs();
// the following method raises the changing event.
// it does not return a task, and cannot be awaited.
OnDataStateChanging(e);
if (e.Cancel)
return;
_dataState = value;
}
}
public event EventHandler<DataStateChangingEventArgs> DataStateChanging;
protected virtual void OnDataStateChanging(DataStateChangingEventArgs e)
{
var dataStateChanging = DataStateChanging;
if (DataStateChanging != null)
DataStateChanging(this, e);
}
}
我实现了这样的页面:
public class ContactsSearchPage : PageBase
{
public ContactsSearchPage() { }
private ContactModel Model {get; set;}
protected async override void OnDataStateChanging(DataStateChangingEventArgs e)
{
// make new requirements
var contactRequirements = new ContactRequirements();
// Because the Refresh is awaited, it returns here and the rest
// of the DataState setter executes
var refreshResult = await Refresh(contactRequirements);
// set the property
Model = refreshResult as ContactModel;
// if the server returned null don't allow the data-state change to proceed
if (Model == null)
e.Cancel = true;
}
}
因为它返回,所以等待刷新(在OnDataStateChanging重写内部)是一个问题。 在不使OnDataStateChanging返回Task的情况下,此模式是否有解决方案?
期望属性设置器将实际设置该属性 ,并且它将在设置器返回之前进行设置。 违反这一期望会引起混乱。
有没有解决此模式的方法?
我建议将您的属性更改为一个吸气剂,以及一种处理集合的方法:
public DataStates DataState { get; private set; }
public Task UpdateDataStateAsync()
{
// ... Use await as necessary
这将使您的API与内部实际发生的情况相匹配,并且更加容易理解。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.