Асинхронный вызов / вызов API-интерфейса в Global.asax

1

Я пытаюсь сделать асинхронный/ожидающий Web API Post в Global.asax, чтобы не блокировать приложение при загрузке при выполнении 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);
        }
    }
}
  • 1
    В любом случае вы просто ожидаете синхронного выполнения асинхронной операции, которая будет вести себя так же, как синхронная версия, но с дополнительными накладными расходами на установку асинхронной операции.
  • 0
    @Servy Спасибо за ответ. Так что вы говорите? Разве невозможно сделать вызов API асинхронным в global.asax?
Показать ещё 5 комментариев
Теги:
asynchronous

2 ответа

0

Вы захотите зарегистрировать методы * Async() с соответствующими обратными вызовами HttpApplication AddOn*(). Это позволяет избежать взаимоблокировок (что я был бы удивлен, если бы у вас их не было). Более подробный ответ здесь: qaru.site/questions/9580477/...

  • 0
    К сожалению, методы AddOn*Async все по запросу. Нет метода AddOnApplicationStartupAsync .
-1

Поскольку это не похоже на то, что вы делаете что-либо с ответом, вместо того, чтобы ждать задания,

RunAsync(somePostValue).Wait();

вы можете стрелять и забыть это так:

Task.Factory.StartNew(() => RunAsync(somePostValue));
  • 0
    RunAsync(somePostValue) достаточно для RunAsync(somePostValue) и забыть

Ещё вопросы

Сообщество Overcoder
Наверх
Меню