簡體   English   中英

如何進行異步調用以在C#中同步運行

[英]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的調用。

來自UserManager.FindAsync的文檔

返回具有指定用戶名和密碼的用戶;如果不匹配,則返回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, usernull因為它不存在?

此外,您可以鏈接呼叫而不是同步運行它:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM