gpt4 book ai didi

asp.net - 对这个操作使用线程本地存储安全吗?

转载 作者:行者123 更新时间:2023-12-03 22:10:40 24 4
gpt4 key购买 nike

我有一个允许最终用户上传文件的 ASP.NET Web 应用程序。一旦文件在服务器上,我就会产生一个线程来处理文件。向线程传递有关特定操作的数据(UserId、文件路径、各种选项等)。大多数数据通过对象和方法参数传递,但 UserId需要更多地在全局范围内可用,所以我把它放在线程本地存储中。

线程很长,但它只是处理文件并中止。在这种情况下,我使用命名数据槽是否安全? 如果 UserA 上传文件,然后 UserB 在第一个文件仍在处理时上传文件,是否有可能 UserA 的线程也将被委派来处理 UserB,从而产生命名槽的冲突? (即插槽被 UserB 的 id 覆盖,并且 UserA 文件的其余操作链接到错误的用户 UserB)。

Public Class FileUploadProcess
Public UserId as String

Public Sub ExecuteAsync()
Dim t As New Thread(New ThreadStart(AddressOf ProcessFile))
t.Start()
End Sub

Protected Sub ProcessFile()
Dim slot As LocalDataStoreSlot = Thread.GetNamedDataSlot("UserId")
Thread.SetData(slot, UserId)

'lengthy operation to process file

Thread.FreeNamedDataSlot("UserId")
Thread.CurrentThread.Abort()
End Sub
End Class

请注意,我不是在问 LocalNamedDataStore插槽是线程安全的。根据定义,我知道它们是。

最佳答案

在这种情况下,您使用线程本地存储是安全的。没有两个线程将共享相同的本地存储(因此它是线程本地的)。因此,两个并发请求不可能踩到其他数据。

不过还有其他一些评论

  • 请避免使用 Thread.Abort .这是一个非常危险的操作,这里真的不需要。该线程将在之后结束该语句。
  • 更好的方法是创建一个类,其中包含具有 UserId 的后台操作。作为本地字段。每个请求都会获得一个新的类实例。这是将数据传递给后台任务的一种更简单的方法
  • 关于asp.net - 对这个操作使用线程本地存储安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8317203/

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