【问题标题】:Virtual async methods in metro c#Metro C#中的虚拟异步方法
【发布时间】:2014-04-23 00:55:07
【问题描述】:

我想定义一个虚方法,它在基类中不是异步的,但在派生类中是异步的,调用者使用委托调用它(实际上它是由屏幕上的按钮激活的 ICommand)我怎么能这样做。

public class BaseClass
{
    BIONESSBindingCommand mLogoffCommand;

    public ICommand LogoffCommand
    {
        get
        {
            if (mLogoffCommand == null)
            {
                mLogoffCommand = new BIONESSBindingCommand(
                    Param => Logoff(), //Command DoWork
                    Param => true); //Always can execute
            }

            return mLogoffCommand;
        }
    }

    public virtual Task Logoff()
    {
        DoLogoff();
        return null; //???
    }
}

public class DerivedClass : BaseClass
{
    public override async Task Logoff()
    {
        await SomeWoAsyncWork();
        base.Logoff(); //Has warninngs
    }
}

【问题讨论】:

  • 难道你正在做的事情不正常吗(除了在构造函数中指定属性和方法)?

标签: c# asynchronous windows-runtime task-parallel-library async-await


【解决方案1】:

致电Task.FromResult 以获取完整的Task。另外,await 在派生类中(这将启用错误传播)。

public class BaseClass
{
  public virtual Task Logoff()
  {
    DoLogoff();
    return Task.FromResult(false);
  }
}

public class DerivedClass : BaseClass
{
  public override async Task Logoff()
  {
    await SomeWoAsyncWork();
    await base.Logoff();
  }
}

【讨论】:

  • 没有。 Task<bool> 派生自 Task
  • 对,这在语法上是有效的,但它有点像返回 Object 的方法。
  • 一点也不。它是一种返回基类型的方法。使用Task,不会丢失语义,也不会出现装箱问题。我同意拥有一个只返回一个普通的TaskTask.FromResult() 会更干净(我确实在我的AsyncEx Library 中提供了一个),但是.NET 没有提供一个。他们决定返回Task<T> 就足以应付这种情况了。
  • 对于在 .NET 4 中使用 Microsoft Async 包的任何人,许多这些静态方法都在 TaskEx 中,而不是在 Task 中,包括 TaskEx.FromResult(...)
  • @batmaci:是的;请注意,它是异步接口方法的同步实现。
猜你喜欢
  • 1970-01-01
  • 2015-09-09
  • 1970-01-01
  • 1970-01-01
  • 2015-03-24
  • 2012-10-28
  • 1970-01-01
  • 2014-09-20
  • 1970-01-01
相关资源
最近更新 更多