簡體   English   中英

需要有關線程安全的建議

[英]Need advice on thread safety

以這種方式編寫代碼是否安全?

        var form = new Form();

        Action callback = 
            () =>
                {
                    // do something 1
                };

        ThreadPool.QueueUserWorkItem(
            args =>
                {
                    // do something 2
                    form.BeginInvoke(callback);
                });

UPD我擔心訪問“表單”變量的安全性。 我從后台線程使用BeginInvoke方法; 我能確定在此之前不會有任何讀/寫重新排序嗎? (從后台線程的角度來看,可能會使“form”變量處於不一致狀態)

是的,它看起來不錯。 將捕獲變量form ,只要在ThreadPool上的作業執行時它不為null ,它應該工作。

但是你遺漏了很多細節,我假設這個代碼全部來自1種方法。

// do something 1可以訪問GUI, // do something 2不能。

ThreadPool.QueueUserWorkItem(
args =>
{
    // do something 2
    form.BeginInvoke(x);
});

這里實際發生的是編譯器為您創建一個全新的類,並在其中有一個成員變量來保存您的Form實例。 這個類是新的,然后傳遞給ThreadPool.QueueUserWorkItem() 所以是的,這是線程安全的。

暫無
暫無

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

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