C# metro c中的虚拟异步方法

C# metro c中的虚拟异步方法,c#,asynchronous,windows-runtime,task-parallel-library,async-await,C#,Asynchronous,Windows Runtime,Task Parallel Library,Async Await,我想定义一个虚拟方法,它在基类中不是异步的,但在派生类中是异步的,调用方使用委托调用它。实际上,它是一个ICommand,由屏幕上的按钮激活。我如何做到这一点 public class BaseClass { BIONESSBindingCommand mLogoffCommand; public ICommand LogoffCommand { get { if (mLogoffCommand == null)

我想定义一个虚拟方法,它在基类中不是异步的,但在派生类中是异步的,调用方使用委托调用它。实际上,它是一个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
    }
}
调用Task.FromResult以获取已完成的任务。另外,在派生类中等待它,这将启用错误传播

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.FromResult以获取已完成的任务。另外,在派生类中等待它,这将启用错误传播

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时,不会丢失任何语义,也不会出现装箱问题。我同意如果有一个Task.FromResult返回的只是一个普通任务,并且我在我的中提供了一个任务,那会更干净,但是.NET没有提供。他们认为返回任务就足够了。对于任何使用.NET 4的Microsoft Async软件包的人来说,这些静态方法中有很多都在TaskEx中,而不是Task中,包括TaskEx.FromResult…@batmaci:Yes;请注意,它是异步接口方法的同步实现。否。Task源于Task。对,这在语法上是有效的,但它有点像返回Object的方法。一点也不。它是一个返回基类型的方法。使用Task时,不会丢失任何语义,也不会出现装箱问题。我同意如果有一个Task.FromResult返回的只是一个普通任务,并且我在我的中提供了一个任务,那会更干净,但是.NET没有提供。他们认为返回任务就足够了。对于任何使用.NET 4的Microsoft Async软件包的人来说,这些静态方法中有很多都在TaskEx中,而不是Task中,包括TaskEx.FromResult…@batmaci:Yes;请注意,它是异步接口方法的同步实现。