[英]how to make async calls to run synchronously in c#
我有這個代碼
ApplicationUser user = await userManager.FindAsync(context.UserName, context.Password)
我希望這段代碼能夠同步運行,因為我的下一個語句就是依賴於此。 由於用戶為null,因此在大多數情況下,以下調用失敗。
var roles = await userManager.GetRolesAsync(user.Id);
有什么建議嗎?
代碼沒有錯。 await
意味着執行僅在隨后的異步方法完成后才能繼續。 這意味着在此代碼段中:
var user = await userManager.FindAsync(context.UserName, context.Password)
var roles = await userManager.GetRolesAsync(user.Id);
僅在上一行完成后才執行對GetRolesAsync
的調用。
返回具有指定用戶名和密碼的用戶;如果不匹配,則返回null。
用戶名或密碼錯誤。 只需向最終用戶返回一條消息,要求他們重試。 如果使用存儲的憑據進行此呼叫,請再次檢查它們。
無論如何,您都需要在嘗試使用user
值之前檢查身份驗證失敗,例如:
var user = await userManager.FindAsync(context.UserName, context.Password)
if (user == null)
{
//Somehow report failure, decrement retry counters, etc
retries--;
return false;
}
else
{
var roles = await userManager.GetRolesAsync(user.Id);
....
}
ApplicationUser user = userManager.FindAsync(context.UserName, context.Password).Result;
var roles = userManager.GetRolesAsync(user.Id).Result;
但是,如果上下文用戶只是null,那么如果您同步執行該操作將無濟於事-該用戶將像以前一樣為NULL。
如果您嘗試將登錄名添加到您的應用程序,則可能有助於檢查this 。
另外,您可能應該使用策略而不是角色。
編輯:
好的,沒有死鎖問題,我不知道(感謝@hvd):
var user = Task.Run(() => userManager.FindAsync(context.UserName, context.Password)).Result;
var roles = Task.Run(() => userManager.GetRolesAsync(user.Id)).Result;
如果異步方法返回void
Task.Run( () => asyncMethod()).Wait();
我不知道為什么會有問題-如果您正確await
,則應該在GetRolesAsync
調用之前正確提取user
。 這是您的整個代碼嗎?
Mayby, user
為null
因為它不存在?
此外,您可以鏈接呼叫而不是同步運行它:
var roles = await userManager.FindAsync(context.UserName, context.Password)
.ContinueWith(task =>
userManager.GetRolesAsync(task.Result.Id))
.Unwrap();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.