【问题标题】:Async/await - any changes in .NET 4.6 or .NET Core?异步/等待 - .NET 4.6 或 .NET Core 中的任何更改?
【发布时间】:2015-04-11 19:02:01
【问题描述】:

大家好

我计划开发一个与这篇精彩文章中介绍的非常相似的自定义等待器

http://blogs.msdn.com/b/lucian/archive/2012/11/24/how-to-hibernate-async-methods-how-to-serialize-task.aspx

简而言之,它允许序列化异步方法的状态,以便在以后反序列化和恢复。

我的担忧是该实现(对于 .NET 4.5)是基于访问结构 AsyncMethodBuilderCore 的私​​有字段 m_stateMachine 的黑客攻击,这是 中的内部类型mscorlib

我根据@Peter 的评论编辑了问题

我想知道是否有人安装了 .NET 4.6 或 .NET Core (ASP.NET 5) 预览版并调查了这些版本中的 async/await,与.NET 4.5?

一些背景

我正在探索使用 C# async/await 语法创作长时间运行的工作流(类似于 Windows Workflow Foundation 提供的工作流)的可能性。这意味着在我的情况下,异步/等待必须由持久性和跟踪机制支持。那么工作流的代码将如下所示:

public class ProcessingWorkflowOfForm12345C : AbstractWorkflow<Form12345C>
{
    private readonly ExternalServices _services;

    public ProcessingWorkflowOfForm12345C(ExternalServices services)
    {
        _services = services;
    }

    public override async void Run(Form12345C form)
    {
        while ( form.ExtraDocumentsRequired )
        {
            var extraDocuments = await _services.RequestExtraDocuments(
                form.GetRequiredExtraDocuments()); // can take weeks
            form.AddExtraDocuments(extraDocuments);
        }

        var approvalResult = _services.AutoApprove(form);

        while ( true )
        {
            switch ( approvalResult )
            {
                case ApprovalResult.Approved:
                    form.SetApproved();
                    return;
                case ApprovalResult.Rejected:
                    form.SetRejected();
                    return;
                case ApprovalResult.Manual:
                    approvalResult = 
                        await _services.RequestManualApproval(form); // can take days
                    break; 
            }
        }
    }
}

【问题讨论】:

  • 在流程中使用异步有什么好处?你想达到什么目的?
  • 微软知道但没有义务说出来。这是你的风险。乍一看,您似乎在滥用该机制来实现它不是为它设计的东西。
  • 旁注:async-await 不需要任务 - 您应该考虑创建完全自定义的可序列化 Awaitable 对象...
  • 可能只有我一个人,但我仍然无法理解为什么您会发现状态机的序列化以任何方式吸引人,因为它可能会在框架的任何未来版本中发生变化,从而导致您的代码打破。不仅如此,而且在您的实现中依赖它也会导致任何未来的开发人员(可能是由于框架更改而修复您的代码)对框架的实现细节有深入的了解。我会像燃烧的火焰一样逃离它。
  • 充其量,这个问题太宽泛了。此外,任何答案都主要涉及推测(一种意见),因此不适合 Stack Overflow。

标签: c# async-await


【解决方案1】:

状态机生成器没有变,还是一模一样。从 .NET Core 2.1 开始唯一改变的是新类型 AsyncStateMachineBox 取代了 MoveNextRunner

您可以在此处找到访问状态机字段以进行序列化的源代码: https://github.com/Dasync/Dasync/tree/master/Engine/AsyncStateMachine

附:使用编译器生成的状态机进行分布式计算有明显的好处。到今天为止,这可以被视为一种 hack,也许明天它会成为一种内置的语言支持。 Conquest of Distributed Systems (part 4) — The Now and the Vision

【讨论】:

    猜你喜欢
    • 2023-03-24
    • 1970-01-01
    • 2013-11-13
    • 1970-01-01
    • 1970-01-01
    • 2014-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多