C# 将wait与实现CancelEventArgs的事件一起使用

C# 将wait与实现CancelEventArgs的事件一起使用,c#,task-parallel-library,async-await,C#,Task Parallel Library,Async Await,我有一个与此类似的基类: 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 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);
    }
}

等待刷新(在OnDataStateChanging覆盖内)是一个问题,因为它返回。在不执行OnDataStateChanging返回任务的情况下,是否有此模式的解决方案?

有一种期望,即属性设置程序将实际设置该属性,并在设置程序返回之前设置该属性。违反这一预期将导致混乱

这种模式有解决方案吗

我建议您将属性更改为getter,并使用一种方法来处理该集:

public DataStates DataState { get; private set; }

public Task UpdateDataStateAsync()
{
   // ... Use await as necessary
这将使您的API与内部实际发生的情况相匹配,并且更易于理解

public DataStates DataState { get; private set; }

public Task UpdateDataStateAsync()
{
   // ... Use await as necessary