【发布时间】:2015-09-29 13:05:35
【问题描述】:
下面是我尝试在异步方法中将 Thread.CurrentPrincipal 设置为自定义 UserPrincipal 对象的简化版本,但自定义对象在离开等待后会丢失,即使它仍在新的 threadID 10 上。
有没有办法在等待中更改 Thread.CurrentPrincipal 并稍后使用它而不传递或返回它?或者这是不安全的,不应该是异步的?我知道有线程更改,但认为 async/await 会为我处理同步。
[TestMethod]
public async Task AsyncTest()
{
var principalType = Thread.CurrentPrincipal.GetType().Name;
// principalType = WindowsPrincipal
// Thread.CurrentThread.ManagedThreadId = 11
await Task.Run(() =>
{
// Tried putting await Task.Yield() here but didn't help
Thread.CurrentPrincipal = new UserPrincipal(Thread.CurrentPrincipal.Identity);
principalType = Thread.CurrentPrincipal.GetType().Name;
// principalType = UserPrincipal
// Thread.CurrentThread.ManagedThreadId = 10
});
principalType = Thread.CurrentPrincipal.GetType().Name;
// principalType = WindowsPrincipal (WHY??)
// Thread.CurrentThread.ManagedThreadId = 10
}
【问题讨论】:
-
您是否在使用 ASP.NET,如果是,您可能想切换到
HttpContext.Current.User,这将为您提供您正在寻找的行为。 -
呵呵,我认为这会出现,并且应该指定这必须适用于 HttpContext 不可用的非 Web 应用程序。
-
我没想到你在哪里(你很少想在网络应用程序中做
Task.Run)。 -
标签: c# asynchronous async-await claims-based-identity current-principal