如何在MVC中执行wait方法



我们使用的是Microsoft Graph SDK。在控制台应用程序中实现了一个POC,其中的代码运行良好,但当在MVC中添加此代码时,它不起作用。代码卡在等待呼叫

从控制器调用

[HttpPost]
public ActionResult InviteUser([Bind(Include = "EmailId")] UserLogin userLogin)
{
if (ModelState.IsValid)
{
string result = AzureADUtil.InviteUser(userLogin.EmailId);
}
return View();
}

方法实施如下

public static string InviteUser(string emailAddress)
{
string result = string.Empty;
result = InviteNewUser(emailAddress).Result;
return result;
}
private static async Task<string> InviteNewUser(string emailAddress)
{
string result = string.Empty;
try
{
IConfidentialClientApplication confidentialClientApplication = ConfidentialClientApplicationBuilder
.Create(clientId)
.WithTenantId(tenantID)
.WithClientSecret(clientSecret)
.Build();
ClientCredentialProvider authProvider = new ClientCredentialProvider(confidentialClientApplication);
GraphServiceClient graphClient = new GraphServiceClient(authProvider);
// Send Invitation to new user
var invitation = new Invitation
{
InvitedUserEmailAddress = emailAddress,
InviteRedirectUrl = "https://myapp.com",
SendInvitationMessage = true,
InvitedUserType = "Member" 
};
// It stucks at this line
await graphClient.Invitations
.Request()
.AddAsync(invitation);
}
catch (Exception ex)
{
result = ex.Message;
}
return result;
}

混合异步等待和阻塞代码(如.Result.Wait()(往往会导致死锁,尤其是在asp.net-mvc.上

如果是异步的,那么就一直走。

[HttpPost]
public async Task<ActionResult> InviteUser([Bind(Include = "EmailId")] UserLogin userLogin) {
if (ModelState.IsValid) {
string result = await AzureADUtil.InviteUser(userLogin.EmailId);
}
return View();
}

实现重构为异步以及

public static async Task<string> InviteUser(string emailAddress)
{
string result = string.Empty;
result = await InviteNewUser(emailAddress);
return result;
}

CCD_ 3现在是冗余的,因为它基本上封装了专用CCD_。

参考Async/Await-异步编程的最佳实践

最好的方法是更新代码,以便在请求链的整个过程中异步运行。你可以这样做:

[HttpPost]
public async Task<ActionResult> InviteUser([Bind(Include = "EmailId")] UserLogin userLogin)
{
if (ModelState.IsValid)
{
string result = await AzureADUtil.InviteNewUser(userLogin.EmailId).ConfigureAwait(false);
}
return View();
}

最新更新