gpt4 book ai didi

c# - 同步使用HttpClient的 "right way"是什么?

转载 作者:行者123 更新时间:2023-12-02 01:51:00 32 4
gpt4 key购买 nike

我在“正确的方式”周围使用了引号,因为我已经很清楚使用异步 API 的正确方式就是简单地让异步行为在整个调用链中传播。这不是这里的一个选项。

我正在处理一个非常大且复杂的系统,专门设计用于在循环中同步进行批处理。

我突然使用 HttpClient 的原因是因为之前批处理的所有数据都是从 SQL 数据库收集的,现在我们添加了一个 Web API 调用。

是的,我们正在同步执行循环中调用 Web API。我知道。将整个事情重写为异步并不是一种选择。这实际上就是我们想做的。 (我们正在尽可能减少 API 调用的数量)

我实际上确实尝试在调用链中传播异步行为,但后来我发现自己有 50 个文件深度更改,仍然有数百个编译器错误需要解决,并且失去了所有希望。我被打败了。

那么,回到问题,鉴于微软建议不要使用 WebRequest 进行新开发,而是使用仅提供异步 API 的 HttpClient,我该怎么办?

这是我正在做的一些伪代码...

foreach (var thingToProcess in thingsToProcess)
{
thingToProcess.ProcessStuff(); // This makes an API call
}

如何实现 ProcessStuff()?

我的第一个实现看起来像这样

public void ProcessStuff()
{
var apiResponse = myHttpClient // this is an instance of HttpClient
.GetAsync(someUrl)
.Result;

// do some stuff with the apiResponse
}

但是,我被告知,当从 ASP.NET 之类的东西调用 .Result 时,由于同步上下文,以这种方式调用 .Result 可能会导致死锁。

你猜怎么着,这个批处理过程将从 ASP.NET Controller 启动。是的,我再次知道,这很愚蠢。当它从 ASP.NET 运行时,它只是“批处理”一项而不是整个批处理,但我离题了,它仍然从 ASP.NET 调用,因此我担心死锁。

那么处理这个问题的“正确方法”是什么?

最佳答案

尝试以下操作:

var task = Task.Run(() => myHttpClient.GetAsync(someUrl)); 
task.Wait();
var response = task.Result;

仅当您无法使用异步方法时才使用它。

正如 MSDN 博客中提到的,此方法完全无死锁: ASP.Net–Do not use Task .Result in main context .

关于c# - 同步使用HttpClient的 "right way"是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53529061/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com