【发布时间】:2022-10-13 19:38:10
【问题描述】:
我有两种返回独立数据的方法。我认为并行运行它们是个好主意。 没有任何修改代码看起来像:
private async Task<Entity> MethodAsync()
{
...
var model1 = await client.Method1(Id1, cancellationToken);
var model2 = await client.Method2(Id2, cancellationToken);
...
}
这些方法按我的预期返回数据。现在,当我更改代码时,所有方法都返回“null”。当我在 Visual Studio 中检查 Task 对象时,有属性 Id = 2356、Status = RanToCompletion、Method = "{null}"、Result = ""。
private async Task<Entity> MethodAsync()
{
var model1Task = client.Method1(Id1, cancellationToken);
var model2Task = client.Method2(Id2, cancellationToken);
var task = Task.WhenAll(new Task[] { model1Task ,model2Task });
await task; //doesn't work
//task.Wait(); //doesn't work
//await Task.WhenAll(new Task[] { model1Task , model2Task }); //doesn't work
//Task.WhenAll(new Task[] { model1Task, model2Task}); //doesn't work
}
客户端方法的代码几乎相同:
public async Task<Model> Method1(Guid Id, CancellationToken cancellationToken)
{
HttpResponseMessage responseMessage = await client.GetAsync($"customEndPoint");
ResponseMessageSingle<Model> response = JsonSerializer.Deserialize<ResponseMessageSingle<Model>>(
await responseMessage.Content.ReadAsStringAsync(cancellationToken),
new JsonSerializerOptions(JsonSerializerDefaults.Web));
return response.result;
}
private class ResponseMessageSingle<T>
{
public bool success { get; set; }
public string message { get; set; }
public T result { get; set; }
}
还有AuthorizeInterceptor(DelegatingHandler):
protected override async Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request, CancellationToken cancellationToken)
{
some logic...
request.SetBearerToken(TokenResponse.AccessToken);
HttpResponseMessage response = await base.SendAsync(request, cancellationToken);
return await Task.FromResult(response);
}
【问题讨论】:
-
“不起作用”是什么意思?例外?什么例外?别的东西?最简单的解释是代码不是线程安全的,并行运行时会抛出异常。
-
“不起作用”不是一个充分的错误描述。你得到一个编译错误?还是意外行为(如异常或错误值)?
-
在您等待
Task.WhenAll之后,您需要从原始任务中获取结果。var model1 = await model1Task; -
我猜“不起作用”等于“抛出 NullReferenceException”?
标签: c# async-await task