繁体   English   中英

将await与实现CancelEventArgs的事件一起使用

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM