3

林在Web API(從DelegatingHandler繼承)2項目等待和線程安全使用的MessageHandler類變量工作

這是使用方法:使用

protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 

在該即時通訊下面的代碼片段:

string stringVariable = HelperClass.SomeFunctionThatReturnsAStringValue(); 

再往下我的代碼,然後讓像這樣

通話

最後接近尾聲我然後執行以下操作:

if (!String.IsNullOrWhiteSpace(stringVariable)) 
       response.Headers.WwwAuthenticate.Add(new AuthenticationHeaderValue(Bearer, stringVariable)); 

我已經設置了下面這也是從閱讀其他職位SO建議web.config中。

<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" /> 
<system.web> 
    <httpRuntime targetFramework="4.5" /> 
    ... 
</system.web> 

我的問題是圍繞着stringVariable。
是否有可能在代碼片段中將該值設置爲不同的結尾@當多個請求在同一時間進入時,將其作爲響應發回。

(我的理解是,當AWAIT被調用,所以線程安全可能是一個問題的處理線程得到釋放)

即:對用戶A的變量被設置,但是當用戶B使得請求@同時爲用戶A設置的值由於等待邏輯而被應用於UserB

+2

直到'await'語句執行時,線程纔會被釋放,並且每個請求都有自己的'stringVaraible',因爲這是一個局部變量。這有幫助嗎? –

+0

感謝Ned,是的,這就是我對await(線程獲得釋放)的理解,所以你說的是stringVariable在上面的上下文中是安全的,並且將始終正確地設置它用於的線程? (不適用於不同用戶的另一個線程) – AdrianSean

+0

是的,這是正確的 –

回答

1

編譯器爲async方法創建一個狀態機,該方法爲執行該方法的每個線程分別進行初始化。所以每個請求線程都有它自己的狀態機,線程本身不會被釋放,直到執行await語句。

每個請求也會有自己的stringVaraible,因爲這是一個本地變量,它不受其他線程影響。

+0

酷酷..所以狀態機將存儲任何局部變量在該含義內下一次線程被調用(它被釋放後)一切都完好無損 – AdrianSean