在Global.asax和HttpHandler中调用异步方法 - 工作方式不同

时间:2016-10-31 11:48:03

标签: c# asp.net async-await task

我上课了:

$except

如果我在 Global.asax 中调用 AsyncTaskRunner.Do(),并在控制器中使用 AsyncTaskRunner.TaskToComplete.Result ,则可以正常工作任务完成,结果可用。如果我从同步HttpHandler(例如)调用 AsyncTaskRunner.Do()而不是 Global.asax 任务永远在 WaitingForActivation 。如何在 Global.asax 中处理异步方法?
更新:我这样称呼public class AsyncTaskRunner { public static Task<string> TaskToComplete; public static void Do() { if (TaskToComplete == null) { TaskToComplete = GetDataAsync(); } } private static async Task<string> GetDataAsync() { using (var httpClient = new HttpClient()) { var res = await httpClient.GetAsync("http://www.google.com"); return res.StatusCode + " - " + DateTime.UtcNow + " - " + Thread.CurrentThread.ManagedThreadId; } } } 所以我不会阻止执行。

1 个答案:

答案 0 :(得分:1)

看起来你正在尝试做一些异步延迟初始化。我建议你使用我的AsyncLazy<T> class

node

用法:

public class AsyncTaskRunner
{
  public static AsyncLazy<string> TaskToComplete { get; } =
      new AsyncLazy<string>(() => GetDataAsync());

  private static async Task<string> GetDataAsync()
  {
    ...
  }
}
在第一次等待string data = await AsyncTaskRunner.TaskToComplete; 之前,不会调用

GetDataAsync