等待杀死进程
Await kills process
我正在尝试连接到 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();
执行一直持续到 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();
}
更新代码,使其始终是异步的。确保您没有在调用堆栈的更高层混合异步和同步代码。避免使用 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);
}
}
the process is simply killed. No exception is thrown, nothing.
我假设您是 运行 控制台应用程序中的这个,并且您的 top-level 代码看起来像这样:
static void Main()
{
MyMethodAsync();
}
在这种情况下,main 方法实际上会退出,因为它不会等待您的异步代码完成。
在控制台应用程序中使用 async
的一种方法是在 Main
方法中进行阻塞。通常,你想去 "async all the way",但控制台应用程序的 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();
}
我正在尝试连接到 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();
执行一直持续到 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();
}
更新代码,使其始终是异步的。确保您没有在调用堆栈的更高层混合异步和同步代码。避免使用 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);
}
}
the process is simply killed. No exception is thrown, nothing.
我假设您是 运行 控制台应用程序中的这个,并且您的 top-level 代码看起来像这样:
static void Main()
{
MyMethodAsync();
}
在这种情况下,main 方法实际上会退出,因为它不会等待您的异步代码完成。
在控制台应用程序中使用 async
的一种方法是在 Main
方法中进行阻塞。通常,你想去 "async all the way",但控制台应用程序的 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();
}