gpt4 book ai didi

.net - 您可以将 Thread.CurrentPrincipal 与 F# 异步工作流程一起使用吗?

转载 作者:行者123 更新时间:2023-12-02 15:42:03 24 4
gpt4 key购买 nike

有人在 F# 异步代码中使用设置 Thread.CurrentPrincipal 进行身份验证吗?

是否有任何需要注意的陷阱,还是一切都按预期进行?

最佳答案

这听起来不是一个好主意,因为 Thread.CurrentPrincipal 依赖于与给定线程关联的 IPrincipal,但在异步工作流程中,您可能不会始终在同一个线程上运行。

考虑这个例子:

open System.Threading

let collectThreadInformation jobId =
async {
let tId1 = Thread.CurrentThread.ManagedThreadId
do! Async.Sleep 1000
let tId2 = Thread.CurrentThread.ManagedThreadId
return jobId, tId1, tId2 }

这是一个简单的异步工作流程,报告休眠一秒之前和之后的线程 ID。下面是并行运行 10 个程序的样子:

> [1 .. 10]
|> List.map collectThreadInformation
|> Async.Parallel
|> Async.RunSynchronously;;
val it : (int * int * int) [] =
[|(1, 15, 15); (2, 14, 15); (3, 15, 15); (4, 15, 15); (5, 15, 15);
(6, 15, 15); (7, 15, 15); (8, 14, 15); (9, 15, 15); (10, 15, 15)|]

正如您所看到的,一些线程 ID 在 Sleep 之前和之后发生了变化,例如第二个元组:(2, 14, 15)。在 sleep 之前,它在线程14上运行,但在 sleep 之后,它在线程15上复活。

我认为将 IPrincipal 实例作为函数参数传递会更安全。

关于.net - 您可以将 Thread.CurrentPrincipal 与 F# 异步工作流程一起使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22662602/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com