为什么异步/等待在我的ASP.net 5控制台应用程序中不起作用?

尼康第三

我在Windows(.NET 4.5.1)和Linux(Mono 4.0.1)上都尝试了这个简单的ASP.net 5控制台应用程序,两次都得到了相同的结果。

注意:我称它为ASP.net 5控制台应用程序,因为在Visual Studio RC中一直称为它。现在它被称为控制台应用程序(软件包),但是它仍然使用来自https://github.com/aspnet/dnx的DNX :)

我的Program.cs

using System;
using System.Threading.Tasks;

namespace ConsoleApplication
{
    public class Program
    {
        public async void Main(String[] args)
        {
            #if DNX451
            AppDomain.CurrentDomain.UnhandledException += 
                (s, e) => Console.WriteLine(e);
            #endif

            try
            {
                await Task.Delay(1000);
                Console.WriteLine("After Task.Delay");
            }
            finally
            {
                Console.WriteLine("Inside Finally");
            }
        }
    }
}

我的project.json

{
    "version": "1.0.0-*",
    "dependencies": {},
    "commands": {
        "ConsoleApplication": "ConsoleApplication"
    },
    "frameworks": {
        "dnx451": {}
    }
}

1.0.0-beta4 CLR一起运行时1.0.0-beta5-11904 CLR,该命令不dnx . ConsoleApplication打印任何内容。程序一旦遇到,就会以状态代码0退出Task.Delay即使finally块也永远不会执行。

我无法测试.NET Core 5.0,因为dnu restore一切正常,但是运行时无法找到包。那好吧...

有人在异步/等待和DNX上有同样的问题吗?还是发现我犯了一些错误?

尤瓦尔·伊茨恰科夫(Yuval Itzchakov)

如果您在入口点看到我的问题(和答案),可以在CoreCLR上使用“异步”修饰符进行标记?,您将在调用堆栈的最顶部看到以下内容:

public static int Execute(string[] args)
{
    // If we're a console host then print exceptions to stderr
    var printExceptionsToStdError = Environment
                                    .GetEnvironmentVariable
                                     (EnvironmentNames.ConsoleHost) == "1";

    try
    {
        return ExecuteAsync(args).GetAwaiter().GetResult();
    }
    catch (Exception ex)
    {
        if (printExceptionsToStdError)
        {
            PrintErrors(ex);
            return 1;
        }

        throw;
    }
}

在内部,它检查方法的返回类型,如果返回类型为type Task,则它注册一个ContinueWith,它可以同步等待:

if (result is Task)
{
    return ((Task)result).ContinueWith(t =>
    {
        return 0;
    });
}

当您传入时async void,它看起来Execute好像该方法是“即弃即用”的void返回方法。这就是为什么它永远不会完成执行的原因。但是,如果将其更改为返回Task,则可以使用:

public async Task Main(String[] args)
{
    #if DNX451
    AppDomain.CurrentDomain.UnhandledException += 
        (s, e) => Console.WriteLine(e);
    #endif

    try
    {
        await Task.Delay(1000);
        Console.WriteLine("After Task.Delay");
    }
    finally
    {
        Console.WriteLine("Inside Finally");
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在“ asp.net 5控制台”应用程序中,“控制台”不包含“ ReadKey”的定义

来自分类Dev

异步和等待在 asp.net MVC 中不起作用

来自分类Dev

不明白为什么我的异步等待在我的 lambda 函数中不起作用

来自分类Dev

Angular 2应用程序在ASP.NET 5环境中不起作用

来自分类Dev

从asp.net调用控制台应用程序

来自分类Dev

在ASP.NET5控制台应用程序中使用Startup类

来自分类Dev

ASP.NET 5 / MVC 6控制台托管的应用程序

来自分类Dev

在控制台应用程序中创建ASP.NET用户

来自分类Dev

ASP.NET Core中控制台应用程序和Web应用程序之间的区别

来自分类Dev

启动时.NET中的控制台应用程序和Windows应用程序有什么区别

来自分类Dev

等待任务永远不会在 ASP.net 中完成,但在控制台应用程序中完成

来自分类Dev

异步在大型ASP.NET应用程序中不起作用,但在新应用程序中

来自分类Dev

从我的asp.net mvc Web应用程序调用asp.net控制台应用程序

来自分类Dev

如何从asp.net核心控制台应用程序中的程序类中的appsettings.json获取值

来自分类Dev

.subscribe在我的ASP.NET MVC应用程序中不起作用

来自分类Dev

Docker容器中的ASP.NET Core / .NET Core控制台应用程序日志记录

来自分类Dev

为什么我的.Net 4.6.2控制台应用程序错误地引用了.net核心类库项目?

来自分类Dev

我们如何在 .NET 5 控制台应用程序中使用 Autofac + Options 模式?

来自分类Dev

.NET Core控制台应用程序的ASP.NET Core配置

来自分类Dev

AKKA.NET是ASP.NET还是控制台应用程序?

来自分类Dev

ASP.NET Core控制台应用程序找不到控制器

来自分类Dev

如何在Web应用程序ASP.net MVC中嵌入C#.net控制台应用程序

来自分类Dev

为什么异步等待在IIS上不起作用,但在IIS Express上却起作用

来自分类Dev

如何在ASP.NET Core 1.0中显示Web应用程序的LoggerFactory日志控制台?

来自分类Dev

IIS托管的asp.net核心应用程序中的控制台日志在哪里

来自分类Dev

异步/等待在我的示例中不起作用

来自分类Dev

Azure Blob上传在ASP .Net Core应用程序中不起作用

来自分类Dev

ASP.NET 应用程序的跟踪在生产服务器中不起作用

来自分类Dev

Javascript断点在Visual Studio 2019 asp.net应用程序中不起作用

Related 相关文章

  1. 1

    在“ asp.net 5控制台”应用程序中,“控制台”不包含“ ReadKey”的定义

  2. 2

    异步和等待在 asp.net MVC 中不起作用

  3. 3

    不明白为什么我的异步等待在我的 lambda 函数中不起作用

  4. 4

    Angular 2应用程序在ASP.NET 5环境中不起作用

  5. 5

    从asp.net调用控制台应用程序

  6. 6

    在ASP.NET5控制台应用程序中使用Startup类

  7. 7

    ASP.NET 5 / MVC 6控制台托管的应用程序

  8. 8

    在控制台应用程序中创建ASP.NET用户

  9. 9

    ASP.NET Core中控制台应用程序和Web应用程序之间的区别

  10. 10

    启动时.NET中的控制台应用程序和Windows应用程序有什么区别

  11. 11

    等待任务永远不会在 ASP.net 中完成,但在控制台应用程序中完成

  12. 12

    异步在大型ASP.NET应用程序中不起作用,但在新应用程序中

  13. 13

    从我的asp.net mvc Web应用程序调用asp.net控制台应用程序

  14. 14

    如何从asp.net核心控制台应用程序中的程序类中的appsettings.json获取值

  15. 15

    .subscribe在我的ASP.NET MVC应用程序中不起作用

  16. 16

    Docker容器中的ASP.NET Core / .NET Core控制台应用程序日志记录

  17. 17

    为什么我的.Net 4.6.2控制台应用程序错误地引用了.net核心类库项目?

  18. 18

    我们如何在 .NET 5 控制台应用程序中使用 Autofac + Options 模式?

  19. 19

    .NET Core控制台应用程序的ASP.NET Core配置

  20. 20

    AKKA.NET是ASP.NET还是控制台应用程序?

  21. 21

    ASP.NET Core控制台应用程序找不到控制器

  22. 22

    如何在Web应用程序ASP.net MVC中嵌入C#.net控制台应用程序

  23. 23

    为什么异步等待在IIS上不起作用,但在IIS Express上却起作用

  24. 24

    如何在ASP.NET Core 1.0中显示Web应用程序的LoggerFactory日志控制台?

  25. 25

    IIS托管的asp.net核心应用程序中的控制台日志在哪里

  26. 26

    异步/等待在我的示例中不起作用

  27. 27

    Azure Blob上传在ASP .Net Core应用程序中不起作用

  28. 28

    ASP.NET 应用程序的跟踪在生产服务器中不起作用

  29. 29

    Javascript断点在Visual Studio 2019 asp.net应用程序中不起作用

热门标签

归档