C# 等待杀戮过程
我正在尝试连接Azure AD,我正在使用此代码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
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();
}