等待杀死进程

vik*_*lim 2 c# asynchronous async-await azure-active-directory microsoft-graph

我正在尝试连接到Azure AD,我正在使用此代码.

try
{
    var clientCredential = new ClientCredential(_clientId, _clientSecret);
    var authContext = new AuthenticationContext(AuthUri + _tenant);
    var authResult = await authContext.AcquireTokenAsync(GraphUri,clientCredential);
    var authString = authResult.CreateAuthorizationHeader();
    var client = new HttpClient();
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    var request = new HttpRequestMessage
    {
        Method = HttpMethod.Get,
        RequestUri = _requestUri,
    };
    request.Headers.Add("Authorization", authString);
    HttpResponseMessage response = null;
    await client.SendAsync(request).ContinueWith(taskWithMessage =>
    {
        response = taskWithMessage.Result;
    });
    return await response.Content.ReadAsStringAsync();
}
catch (Exception ex)
{
   Console.WriteLine(ex);
}
Run Code Online (Sandbox Code Playgroud)

我不明白的一个大问题是,当执行到达第一个await(var authResult = await authContext.AcquireTokenAsync(GraphUri,clientCredential);)时,该进程被简单地杀死.没有例外,没有.

如果我替换该行

var authResult = authContext.AcquireTokenAsync(GraphUri,clientCredential); 
var authString = authResult.Result.CreateAuthorizationHeader();
Run Code Online (Sandbox Code Playgroud)

执行继续执行,直到await client.SendAsync(request).ContinueWith(taskWithMessage...进程再次被杀死,没有任何异常被抛出或任何警告或其他消息.

更奇怪的是,这个代码在另一个项目中运行得很好,但在这里它不会工作.

编辑:

static void ImportLicence()
{
   InsertToDb();
}

public async void InsertoDb()
{
   var x = await GetSP();
}

public async Task<Dictionary<ServicePlanViewModel, List<ServicePlanViewModel>>> GetSP()
{
   var sp = await MakeRq();
}

public async Task<string> MakeRequest()
{
   var authString = await GetAuth();
   ..........
   return await response.Content.ReadAsStringAsync();
}

private async Task<string> GetAuth()
{
   .....
   var authResult = await authContext.AcquireTokenAsync(GraphUri, clientCredential);
   return authResult.CreateAuthorizationHeader();
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*ary 6

这个过程简直就是杀了.没有例外,没有.

我假设你在控制台应用程序中运行它,并且你的顶级代码看起来像这样:

static void Main()
{
  MyMethodAsync();
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,main方法实际上会退出,因为它不等待您的异步代码完成.

一起工作的一种方法async在控制台应用程序是在阻止Main方法.通常,您希望"始终保持异步",但控制台应用程序的Main方法是此规则的一个例外:

static void Main() => MainAsync().GetAwaiter().GetResult();
static async Task MainAsync()
{
  // Original code from Main, but adding any necessary `await`s.
  await MyMethodAsync();
}
Run Code Online (Sandbox Code Playgroud)

更新: 不要使用async void ; async Task改为使用:

static async Task ImportLicenceAsync()
{
  await InsertToDbAsync();
}

public async Task InsertoDbAsync()
{
  var x = await GetSPAsync();
}
Run Code Online (Sandbox Code Playgroud)

  • @viktorfilim然后显示完成问题的代码,包括所有调用直到Main()。 (2认同)