我上课了:
$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;
}
}
}
所以我不会阻止执行。
答案 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
。