- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我有一个用于记录 api 请求的 DelegatingHandler。我想访问请求和响应内容以便保存到数据库。
我可以直接使用:
var requestBody = request.Content.ReadAsStringAsync().Result;
我在很多例子中都看到了这一点。也建议使用here似乎知道他们在说什么的人。顺便说一句,之所以提出这个建议,是因为发帖人最初使用的是 ContinueWith,但遇到间歇性问题。
在其他地方,here ,作者明确表示不要这样做,因为它会导致死锁,并建议改用 ContinueWith。此信息显然直接来自 ASP.net 团队。
所以我有点困惑。这 2 个场景在我看来非常相似,因此看起来很矛盾。
我应该使用哪个?
最佳答案
你应该使用await
。
Result
的一个问题是 it can cause deadlocks ,正如我在我的博客上所描述的那样。
ConfigureAwait
的问题在于,默认情况下它将在 HTTP 请求上下文之外的线程池上执行延续。
您可以使用这些方法中的任何一种来获得可行的解决方案(尽管正如 Youssef 指出的那样,Result
的性能仍然不理想),但何必呢? await
为您完成这一切:无死锁、最佳线程和在 HTTP 请求上下文中恢复。
var requestBody = await request.Content.ReadAsStringAsync();
针对 .NET 4.0 进行编辑:首先,我强烈建议升级到 .NET 4.5。 ASP.NET 运行时在 .NET 4.5 中得到增强,可以正确处理基于 Task
的 async
操作。因此,如果您将 WebAPI 安装到 .NET 4.0 项目中,下面的代码可能会或可能不会工作。
就是说,如果您想正确地尝试使用老派的 ContinueWith
,像这样的方法应该可行:
protected override Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request,
CancellationToken cancellationToken)
{
var context = TaskScheduler.FromCurrentSynchronizationContext();
var tcs = new TaskCompletionSource<HttpResponseMessage>();
HttpResponseMessage ret;
try
{
... // logic before you need the context
}
catch (Exception ex)
{
tcs.TrySetException(ex);
return tcs.Task;
}
request.Content.ReadAsStringAsync().ContinueWith(t =>
{
if (t.Exception != null)
{
tcs.TrySetException(t.Exception.InnerException);
return;
}
var content = t.Result;
try
{
... // logic after you have the context
}
catch (Exception ex)
{
tcs.TrySetException(ex);
}
tcs.TrySetResult(ret);
}, context);
return tcs.Task;
}
现在很清楚为什么 await
好得多了......
关于asp.net-web-api - 我应该在 DelegatingHandler 中的 ReadAsAsync 之后使用 ContinueWith(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15817594/
此处讨论的代码是用 C# 编写并使用 .netcore 3.1 执行 我有以下代码,它在后台启动工作负载而不等待它完成(即发即忘): public void StartBackgroundWork(I
我正在尝试记录对 API 的请求和响应。我目前正在使用一个 delegatingHandler 来捕获 httpwebresponses 和 httpwebrequests。 处理程序: pr
我遇到了以下我试图理解的异步代码(针对此示例进行了简化): class Program { static async Task Main(string[] args) {
我刚刚开始熟悉 Task Parallel Library,但有一个相当琐碎的问题,我无法找到明确的答案。 以下片段之间有什么区别,我应该在什么时候选择一个而不是另一个? Task t = Task.
我在一个很难重现的竞争条件下运行,从我的代码分析来看,它似乎来自一个不执行(或直到结束才执行)的延续。 这里是一些呈现上下文的伪代码: Task GetObject(string id) {
我看到了 Stephen Cleary 关于 Startnew being dangerous 的博客以及如何continuewith is also dangerous .我想在这里使用它来避免在出
我试图在这个例子中链接执行任务: static List clsTaskList = new List(); private static void Tasks2() { Task t1 =
我有以下代码(https://github.com/avinash0161/OrleansExperiments/tree/c0155b4b0c8c1bfe60aea8624f2cc83a52853d
我们的团队遇到了一个问题,即 ContinueWith() 在主机进程关闭之前不会运行。例如,下面的代码已经在生产环境中运行良好一年了。但是自从我们开始使用更新版本的框架后,我们就遇到了这个问题。 运
我在一堆 LINQ 查询上有一些 GUI。查询需要一些时间来执行,所以我希望 GUI 能够响应并显示繁忙指示器和进度条。许多查询是为了检查数据中存在的某些条件。如果查询返回空结果,应用程序应继续下一个
使用 Visual Studio 2015,针对 FW 4(在 FW 4 下测试不可观察的异常): 我期待这段代码: static void Main(string[] args) { try
如果这是一个简单的问题,请原谅我;我无法用足够通用的方式来表达它来搜索答案。 考虑这段代码: var task = Task.Factory.StartNew(() => Whatever());
使用什么值 ContinueWith(Action continuationAction)对于 CancellationToken , TaskContinuationOptions和 TaskSch
我有这个示例代码: static void Main(string[] args) { var t1 = Task.Run(async () => {
我有一些代码用作轻量级、非阻塞的关键部分。我希望无论 Task.Run 子句中的 _func 和 cancellationToken 发生什么情况,都能保证继续运行,这样finally block 中
我用这个代码 public static void Main() { Task t = new Task(() => { return 43; });
请看下面的代码- static void Main(string[] args) { // Get the task. var task = Task.Factory.StartNew
我有控制台应用程序和代码如下, 我的问题是在ContinueWith任务完成之前,控制台应用程序结束,它不等待continueWith完成,请指教。 请让我知道我遗漏了什么或不正确。 var task
我有以下代码,其中延续代码没有被执行。 using System; using System.Threading; using System.Threading.Tasks; namespace Ko
据我了解,ContinueWith 方法会等待相关任务完成。对于以下代码,这意味着它在完成子任务后就完成了。如果这是真的,为什么它有时会输出0 0 0 和其他时间 0 1 2? static
我是一名优秀的程序员,十分优秀!