C# Global.asax中的异步/等待Web API调用

C# Global.asax中的异步/等待Web API调用,c#,asp.net,asynchronous,C#,Asp.net,Asynchronous,我正在尝试在Global.asax中执行异步/等待Web API Post,以便在执行Rest API Post时不会阻止应用程序加载 但是应用程序永远不会启动,如果不异步执行,事情会变得更快。我做错了什么 public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { AreaRegistration.RegisterAllAreas(

我正在尝试在Global.asax中执行异步/等待Web API Post,以便在执行Rest API Post时不会阻止应用程序加载

但是应用程序永远不会启动,如果不异步执行,事情会变得更快。我做错了什么

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
    }

    protected void Session_Start(object sender, EventArgs e)
    {
        var somePostValue = myJsonString();  
        RunAsync(somePostValue).Wait();
    }

    private static async Task RunAsync(string postValue)
    {
        using (var client = new HttpClient())
        {
            client.BaseAddress = new Uri("http://localhost:56789/");
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            var response = await client.PostAsJsonAsync("api/MyApi", postValue);
        }
    }
}

因为看起来你没有对响应做任何事情,而不是等待任务

RunAsync(somePostValue).Wait();
你可以开火,然后像这样忘记它:

Task.Factory.StartNew(() => RunAsync(somePostValue));

您需要使用适当的
HttpApplication
AddOn*()
回调来注册*Async()方法。这避免了死锁(如果您没有死锁,我会很惊讶)这里有一个更详细的答案:

您只是同步地等待异步操作,它的行为将与同步版本一样,但是设置异步操作会增加额外的开销。@Servy感谢您的回复。你在说什么?在global.asax中不可能异步执行api调用吗?我是说您实际上并不是异步执行的。@Servy确定。你能告诉我怎么做吗?不要同步地等待操作完成。
RunAsync(somePostValue)
对于fire和forge已经足够了。幸运的是,
AddOn*Async
方法都是每个请求的。没有
addonapplicationstartupsync
方法。