簡體   English   中英

如何檢測多線程使用?

[英]How do I detect multi-threaded use?

是否足以在創建對象時和調用方法時比較ManagedThreadId以驗證它是否未在多線程場景中使用?

public class SingleThreadSafe
{
    private readonly int threadId;
    public SingleThreadSafe()
    {
        threadId = Thread.CurrentThread.ManagedThreadId;
    }

    public void DoSomethingUsefulButNotThreadSafe()
    {
        if(threadId!=Thread.CurrentThread.ManagedThreadId)
        {
            throw new InvalidOperationException(
                "This object is being accessed by a thread different than the one that created it. " +
                " But no effort has been made to make this object thread safe.");
        }
        //Do something useful, like use a previously established DbConnection
    }
}

我的直覺在線程方面經常是錯誤的,所以我想檢查一下我是否應該記住邊緣情況。

不,還不夠!

托管線程ID 可以被 CLR 重用 ,所以if(threadId!=Thread.CurrentThread.ManagedThreadId)可以返回false ,甚至是調用線程用於構建對象的不同。

您通過參考比較可以實現的目標是:

if (!object.ReferenceEquals(Thread.CurrentThread, ThreadThatCreatedThis))
// ...

編輯:

然而, MSDN說:

即使承載公共語言運行庫的非托管代碼將線程實現為光纖,ManagedThreadId屬性的值也不會隨時間變化。

http://msdn.microsoft.com/en-us/library/system.threading.thread.managedthreadid%28v=vs.110%29.aspx

這基本上就是Windows Forms的功能。 這是Control.InvokeRequired的片段(引自參考源 ):

public bool InvokeRequired {
    get {
        using (new MultithreadSafeCallScope())
        {
            ...
            int hwndThread = SafeNativeMethods.GetWindowThreadProcessId(hwnd, out pid);
            int currentThread = SafeNativeMethods.GetCurrentThreadId();
            return(hwndThread != currentThread);
        }
    }
}

如果比較線程ID對於Windows Forms來說已經足夠了,我想它對我來說已經足夠了......

我擔心不會。

對於類似的場景我正在使用ThreadStatic (或線程本地存儲

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM