[英]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.