Microsoft Identity มีวิธีส่วนขยายที่เรียกใช้วิธีการแบบซิงโครนัสพร้อมกัน ตัวอย่างเช่นมีวิธี GenerateUserIdentityAsync () และ CreateIdentity เท่ากัน ()
หากคุณดู UserManagerExtensions.CreateIdentity () มันจะมีลักษณะดังนี้:
public static ClaimsIdentity CreateIdentity<TUser, TKey>(this UserManager<TUser, TKey> manager, TUser user,
string authenticationType)
where TKey : IEquatable<TKey>
where TUser : class, IUser<TKey>
{
if (manager == null)
{
throw new ArgumentNullException("manager");
}
return AsyncHelper.RunSync(() => manager.CreateIdentityAsync(user, authenticationType));
}
ตอนนี้มาดูสิ่งที่ AsyncHelper.RunSync ทำ
public static TResult RunSync<TResult>(Func<Task<TResult>> func)
{
var cultureUi = CultureInfo.CurrentUICulture;
var culture = CultureInfo.CurrentCulture;
return _myTaskFactory.StartNew(() =>
{
Thread.CurrentThread.CurrentCulture = culture;
Thread.CurrentThread.CurrentUICulture = cultureUi;
return func();
}).Unwrap().GetAwaiter().GetResult();
}
ดังนั้นนี่คือ wrapper ของคุณสำหรับวิธี async และโปรดอย่าอ่านข้อมูลจากผลลัพธ์ - มันอาจบล็อกรหัสของคุณใน ASP
มีวิธีอื่น - ซึ่งเป็นที่น่าสงสัยสำหรับฉัน แต่คุณสามารถพิจารณาด้วย
Result r = null;
YourAsyncMethod()
.ContinueWith(t =>
{
r = t.Result;
})
.Wait();