gpt4 book ai didi

.net - 异步等待处理程序死锁

转载 作者:行者123 更新时间:2023-12-04 10:08:02 24 4
gpt4 key购买 nike

我陷入了异步死锁,无法找出正确的语法来修复它。我查看了几种不同的解决方案,但似乎无法完全弄清楚导致问题的原因。

我正在使用 Parse作为后端并尝试使用处理程序写入表。我的处理程序看起来像:

public class VisitorSignupHandler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
//Get the user's name and email address
var UserFullName = context.Request.QueryString["name"].UrlDecode();
var UserEmailAddress = context.Request.QueryString["email"].UrlDecode();

//Save the user's information
var TaskToken = UserSignup.SaveUserSignup(UserFullName, UserEmailAddress);
TaskToken.Wait();
....

}

public bool IsReusable { get { return false; } }
}

然后它调用我的中间层:
public static class UserSignup
{
public static async Task SaveUserSignup(string fullName, string emailAddress)
{
//Initialize the Parse client with the Application ID and the Windows key
ParseClient.Initialize(AppID, Key);

//Create the object
var UserObject = new ParseObject("UserSignup")
{
{"UserFullName", fullName},
{"UserEmailAddress", emailAddress}
};

//Commit the object
await UserObject.SaveAsync();
}
}

虽然这似乎卡在 Wait() .我的印象是 Wait()只需等待任务完成,然后返回正常操作。这不正确吗?

最佳答案

您遇到了我描述的常见死锁问题 on my blogin a recent MSDN article .

简而言之,await默认情况下将恢复其 async捕获的“上下文”中的方法,在 ASP.NET 上,一次只允许一个线程进入该“上下文”。所以当你调用Wait ,您在该上下文中阻塞了一个线程,并且 await准备恢复 async 时无法进入该上下文方法。因此上下文中的线程在 Wait 处被阻塞。 (等待 async 方法完成)和 async方法被阻塞,等待上下文空闲...死锁。

要解决此问题,您应该“一直异步”。在这种情况下,请使用 HttpTaskAsyncHandler 而不是 IHttpHandler :

public class VisitorSignupHandler : HttpTaskAsyncHandler
{
public override async Task ProcessRequestAsync(HttpContext context)
{
//Get the user's name and email address
var UserFullName = context.Request.QueryString["name"].UrlDecode();
var UserEmailAddress = context.Request.QueryString["email"].UrlDecode();

//Save the user's information
var TaskToken = UserSignup.SaveUserSignup(UserFullName, UserEmailAddress);
await TaskToken;
....

}
}

关于.net - 异步等待处理程序死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17859898/

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