我有一個允許最終用戶上傳文件的ASP.NET Web應用程序。一旦文件在服務器上,我就產生一個線程來處理文件。該線程傳遞有關特定操作的數據(UserId
,文件路徑,各種選項等)。大部分數據都是通過對象和方法參數傳遞的,但是UserId
需要全局更多,所以我把它放在線程本地存儲中。是否使用線程本地存儲安全進行此操作?
線程很長,但它只是處理文件並中止。在這種情況下,我使用指定的數據插槽是否安全? 如果UserA上傳文件,則UserB在第一個文件仍在處理時上載文件,是否有可能UserA的線程也將被委派處理UserB,從而對指定的插槽產生衝突?(即插槽被UserB的id覆蓋,UserA文件的其餘操作鏈接到錯誤的User,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
插槽是線程安全不是問。根據定義,我知道他們是。
+1避免Thread.Abort –
是否有可能一個線程一次可以處理多個文件?對不起,如果你回答了這個問題,或者如果這沒有意義,但實際上多線程是有點超越我。 – Jeff
@Jeff給出簡短的代碼示例我會說不。它看起來每個線程都是專用於單個文件 – JaredPar