【问题标题】:How to override a function that returns a task如何覆盖返回任务的函数
【发布时间】:2015-04-19 00:40:46
【问题描述】:

我有以下功能:

public override Task<SignInStatus> PasswordSignInAsync(string userName, string password, bool isPersistent, bool shouldLockout)
{
    return base.PasswordSignInAsync(userName, password, isPersistent, shouldLockout);
}

我想把它修改成这样:

public override Task<SignInStatus> PasswordSignInAsync(string userName, string password, bool isPersistent, bool shouldLockout)
{
    var result = base.PasswordSignInAsync(userName, password, isPersistent, shouldLockout);

    //If status was successful do some thing here
    if(result =  success)
    {
       //update last logged in time.
    }

    //Lastly return the result
    return result;
}

现在我想修改函数的作用。

我想执行基本任务,然后使用它的结果在我的覆盖函数中执行某些操作?

我该怎么做?

【问题讨论】:

    标签: c# async-await task-parallel-library overriding


    【解决方案1】:

    您可以通过在方法中添加 async 关键字并等待基本操作来实现:

    public async override Task<SignInStatus> PasswordSignInAsync(string userName, string password, bool isPersistent, bool shouldLockout)
    {
        var result = await base.PasswordSignInAsync(userName, password, isPersistent, shouldLockout);
    
        // Check result
        return result;
    }
    

    由于提供的基本调用返回一个可等待的Task&lt;T&gt;,您可以使用async-await 等待它的异步完成。

    请注意,这意味着您必须“一直异步”并确保在整个调用堆栈中正确等待调用。

    更多关于async-await的信息可以在here找到

    【讨论】:

    • 那我最后只返回结果吗?
    • 是的。您在方法调用中使用了await,这一事实使编译器将操作转换为生成Task 的状态机。当您return result 时,该结果实际上被包装为Task&lt;SignInStatus&gt;
    • 我在添加异步和等待返回任务的覆盖方法时遇到 stackoverflow 异常..
    • @Bartosz 提出一个新问题并提供相关详细信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-14
    • 2019-05-09
    • 1970-01-01
    • 2017-12-16
    • 2017-09-19
    • 2017-03-26
    相关资源
    最近更新 更多