0

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); 
} 

큰 문제는 실행이 처음 await를 도달 할 때 (var authResult = await authContext.AcquireTokenAsync(GraphUri,clientCredential);) 프로세스가 간단하게 살해된다는 것이다. 예외는 발생하지 않으며 아무 것도 던지지 않습니다.

나는 실행 프로세스가 발생되는 예외 또는 경고 또는 무언가의 메시지없이 다시 살해 await client.SendAsync(request).ContinueWith(taskWithMessage... 때까지 계속

var authResult = authContext.AcquireTokenAsync(GraphUri,clientCredential); 
var authString = authResult.Result.CreateAuthorizationHeader(); 

와 그 라인을 교체하십시오.

이 코드는 다른 프로젝트에서 잘 실행되지만 여기서는 작동하지 않습니다.

편집 :

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(); 
} 
+0

당신이'.ContinueWith'을 무시하고 단순히 사용할 수''async' await'을 모두 결합하여 문제가 반복되는지 확인하려고하지 않습니다. –

+0

@AkashKava 같은 일이 발생합니다. 그 과정은 죽는다. – viktorfilim

+2

@viktorfilim, 동기화 및 비동기 구현을 혼합합니다. 이 코드가 캡슐화 된 방법을 보여주십시오. – Nkosi

답변

5

는 과정을 간단하게 살해된다. 예외는 발생하지 않으며 아무 것도 던지지 않습니다.

나는 당신이 콘솔 응용 프로그램이 실행한다고 가정하고, 최상위 코드는 다음과 같이 보일 것이다 :

static void Main() 
{ 
    MyMethodAsync(); 
} 

하는 경우, 주요 방법 것 사실 출구에서, 비동기 코드가 완료되기를 기다리지 않기 때문입니다.

콘솔 응용 프로그램에서 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(); 
} 

업데이트 :Don't use async void; 대신 async Task를 사용

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

public async Task InsertoDbAsync() 
{ 
    var x = await GetSPAsync(); 
} 
+0

같은 결과가 있습니다. 나는 이것을 시도했다. 이것은 나의 초기 코드에 있었다. – viktorfilim

+1

@viktorfilim 그런 다음 질문에 그렇게했던 코드를 보여주고, 모든 호출을'Main()'까지 포함시킵니다. –

1

업데이트 코드 있도록 통해 모든 방법 비동기입니다. 호출 스택보다 높은 비동기 및 동기화 코드를 혼합하지 않도록하십시오. async void을 사용하지 마십시오.

public async Task<string> SomeMethodAsync() { 
    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); 

     using(var response = await client.SendAsync(request)) { 
      return await response.Content.ReadAsStringAsync(); 
     }  
    } catch (Exception ex) { 
     Console.WriteLine(ex); 
    } 
} 
+0

예, 콘솔 응용 프로그램입니다. 그리고 코드는 모든면에서 비동기입니다. 그러나 결과는 같습니다. – viktorfilim

관련 문제