Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在ASP.Net核心应用程序启动期间运行异步代码_C#_Azure_Asp.net Core_Asynchronous_Azure Webapps - Fatal编程技术网

C# 在ASP.Net核心应用程序启动期间运行异步代码

C# 在ASP.Net核心应用程序启动期间运行异步代码,c#,azure,asp.net-core,asynchronous,azure-webapps,C#,Azure,Asp.net Core,Asynchronous,Azure Webapps,将函数ConfigureServices的签名更改为异步后(最初它只是一个无效的同步函数,应用程序工作得非常好),我得到以下错误: 找不到所需的服务。请通过调用应用程序启动代码中的ConfigureServices(…)来添加所有必需的服务 下面是我的ConfigureServices功能的代码 // This method gets called by the runtime. Use this method to add services to the container. public a

将函数
ConfigureServices
的签名更改为异步后(最初它只是一个无效的同步函数,应用程序工作得非常好),我得到以下错误:

找不到所需的服务。请通过调用应用程序启动代码中的
ConfigureServices(…)
来添加所有必需的服务

下面是我的
ConfigureServices
功能的代码

// This method gets called by the runtime. Use this method to add services to the container.
public async Task ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages();

    // Create the necessary Cosmos DB infrastructure
    await CreateDatabaseAsync();
    await CreateContainerAsync();
}

ConfigureServices
在运行时自动调用。

您不能只更改签名,它需要为void才能被框架调用

现在,当您将其更改为Task时,这意味着框架找不到它,因此根本不会调用它

这里有一个GitHub问题:

但这很棘手

5.0没有任何进展不,我们不知道如何在不阻止或破坏更改的情况下做到这一点。可以分两个阶段运行过滤器,这两个阶段不会重叠

根据您的评论更新: 如果您想在启动期间运行异步操作,我通常会这样做:

public interface IStartupTask
{
     Task Execute();
}
我创建了如下界面:

public interface IStartupTask
{
     Task Execute();
}
然后是这样一个示例实现

public class CreateDatabaseStartupTask : IStartupTask
{
    public async Task Execute()
    {
          // My logic here
          // await CreateDatabaseAsync();
    }
}
然后在我的程序中

public static async Task Main(string[] args)
{
    var host = CreateHostBuilder(args).Build();
    
    // Resolve the StartupTasks from the ServiceProvider
    var startupTasks = host.Services.GetServices<IStartupTask>();
    
    // Run the StartupTasks
    foreach(var startupTask in startupTasks)
    {
        await startupTask.Execute();
    }
    await host.RunAsync();
}

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
        });
}
公共静态异步任务主(字符串[]args)
{
var host=CreateHostBuilder(args.Build();
//从服务提供商处解析StartupTasks
var startupTasks=host.Services.GetServices();
//运行StartupTasks
foreach(startupTasks中的var startupTask)
{
等待startupTask.Execute();
}
等待host.RunAsync();
}
公共静态IHostBuilder CreateHostBuilder(字符串[]args)=>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder=>
{
webBuilder.UseStartup();
});
}
我的创业公司呢

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddTransient<IStartupTask, CreateDatabaseStartupTask>();
    }
}
公共类启动
{
public void配置服务(IServiceCollection服务)
{
services.AddTransient();
}
}
因此,重要的是:

  • 注册您的StartupTasks
  • 构建主机
  • 解决启动任务
  • 运行StartupTasks
  • 启动主机

  • 那么,我在启动时如何调用异步函数(CreateDatabaseAsync和CreateContainerAsync)?用示例更新了我的答案这很好-一定要尝试一下