在Global.asax中异步/等待Web API调用

时间:2015-01-19 21:38:38

标签: c# asp.net asynchronous

我试图在Global.asax中执行async / await 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);
        }
    }
}

2 个答案:

答案 0 :(得分:0)

您希望使用正确的HttpApplication AddOn*()回调注册* Async()方法。这可以避免死锁(如果你没有死锁,我会感到惊讶)这里有一个更详细的答案:https://stackoverflow.com/a/42007294/1754346

答案 1 :(得分:-1)

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

RunAsync(somePostValue).Wait();

你可以解雇并忘记它:

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