C# 等待杀戮过程

C# 等待杀戮过程,c#,asynchronous,async-await,azure-active-directory,microsoft-graph-api,C#,Asynchronous,Async Await,Azure Active Directory,Microsoft Graph Api,我正在尝试连接Azure AD,我正在使用此代码 try { var clientCredential = new ClientCredential(_clientId, _clientSecret); var authContext = new AuthenticationContext(AuthUri + _tenant); var authResult = await authContext.AcquireTokenAsync(GraphUri,clientCred

我正在尝试连接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);
}
我不明白的一个大问题是,当执行到达第一个等待(
var authResult=await authContext.AcquireTokenAsync(GraphUri,clientCredential);
)时,进程就会被终止。没有抛出异常,什么都没有

如果我用

var authResult = authContext.AcquireTokenAsync(GraphUri,clientCredential); 
var authString = authResult.Result.CreateAuthorizationHeader();
执行一直持续到
wait client.SendAsync(request).ContinueWith(taskWithMessage…
,在此过程中再次终止,不会引发任何异常或任何警告消息或其他消息

更奇怪的是,这段代码在另一个项目中运行得很好,但在这里却无法工作

编辑:

static void ImportLicence()
{
InsertToDb();
}
公共异步void InsertoDb()
{
var x=等待GetSP();
}
公共异步任务GetSP()
{
var sp=await MakeRq();
}
公共异步任务MakeRequest()
{
var authString=await GetAuth();
..........
return wait response.Content.ReadAsStringAsync();
}
私有异步任务GetAuth()
{
.....
var authResult=await authContext.AcquireTokenAsync(GraphUri,clientCredential);
返回authResult.CreateAuthorizationHeader();
}

更新代码,使其始终是异步的。确保不要在调用堆栈的更高层混合使用异步和同步代码。避免使用
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);
    }
}
公共异步任务SomeMethodAsync(){ 试一试{ var clientCredential=新的clientCredential(\u clientId,\u clientSecret); var authContext=新的AuthenticationContext(AuthUri+\u租户); var authResult=await authContext.AcquireTokenAsync(GraphUri,clientCredential); var authString=authResult.CreateAuthorizationHeader(); var client=新的HttpClient(); client.DefaultRequestHeaders.Accept.Add(新的MediaTypeWithQualityHeaderValue(“应用程序/json”); var请求=新的HttpRequestMessage{ Method=HttpMethod.Get, RequestUri=\u RequestUri, }; 添加(“授权”,authString); 使用(var-response=await-client.sendsync(请求)){ return wait response.Content.ReadAsStringAsync(); } }捕获(例外情况除外){ 控制台写入线(ex); } } 进程被简单地终止,没有抛出异常,什么也没有

我假设您正在控制台应用程序中运行此程序,并且您的顶级代码如下所示:

static void Main()
{
  MyMethodAsync();
}
在这种情况下,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();
}
更新:;改用
异步任务

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

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

您可以忽略
。继续使用
,只需使用
异步
等待
,不要尝试将两者结合起来,看看问题是否会重复。@AkashKava同样的情况发生。进程被终止。@viktorfilim,您正在混合同步和异步实现。显示此代码封装的方法。@Nkosi我已更新了同样的结果。我已经试过了。这是在我的初始代码中。@viktorfilim然后在你的问题中显示这样做的代码,包括到
Main()
Yes的所有调用。这是一个控制台应用程序。代码一直是异步的。但是结果是一样的。
static async Task ImportLicenceAsync()
{
  await InsertToDbAsync();
}

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