【问题标题】:Overriding async method properly in C#在 C# 中正确覆盖异步方法
【发布时间】:2020-05-28 01:09:50
【问题描述】:

我有一个基类,它定义了一个返回任务的抽象方法。

public abstract class BaseClass
{
    public abstract Task DoSomething();
}

我可以创建一个以这两种不同方式实现抽象方法的类。

public class Example1 : BaseClass
{
    public override Task DoSomething()
    {
        return Task.CompletedTask;
    }
}

或者像这样

public class Example2 : BaseClass
{
    public override async Task DoSomething()
    {
    }
}

请注意,第一个返回一个已完成的任务,第二个包含 async 关键字并且没有返回语句。两者有区别吗?

【问题讨论】:

  • 在第一个返回类型是需要的,在第二个视觉工作室说warning CS1998: This async method lacks 'await' operators and will run synchronously.,如果你没有在那个方法中使用任何等待。更多信息stackoverflow.com/questions/13243975/…
  • @daremachine - 感谢您的 cmets。我没有收到警告,但您的解释是有道理的。
  • 警告在构建输出中,或者如果您在 VS 中有下划线的方法名称,请在其上获取鼠标指针。很高兴能提供帮助。
  • 我会使用前一个例子。它清晰、简单且易于理解。

标签: c# asynchronous task


【解决方案1】:

生成的代码存在显着差异。通过仅添加 async 关键字,该方法的编译方式就大不相同了。

以下是编译器生成的有效内容:

public class Example2 : BaseClass
{
    private struct DoSomethingStateMachine : IAsyncStateMachine
    {
        public int _state;

        public AsyncTaskMethodBuilder _builder;

        private void MoveNext()
        {
            try
            {
            }
            catch (Exception exception)
            {
                _state = -2;
                _builder.SetException(exception);
                return;
            }
            _state = -2;
            _builder.SetResult();
        }

        void IAsyncStateMachine.MoveNext()
        {
            this.MoveNext();
        }

        private void SetStateMachine(IAsyncStateMachine stateMachine)
        {
            _builder.SetStateMachine(stateMachine);
        }

        void IAsyncStateMachine.SetStateMachine(IAsyncStateMachine stateMachine)
        {
            this.SetStateMachine(stateMachine);
        }
    }

    public override Task DoSomething()
    {
        DoSomethingStateMachine stateMachine = default(DoSomethingStateMachine);
        stateMachine._builder = AsyncTaskMethodBuilder.Create();
        stateMachine._state = -1;
        AsyncTaskMethodBuilder _builder = stateMachine._builder;
        _builder.Start(ref stateMachine);
        return stateMachine._builder.Task;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-19
    • 2015-08-08
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多