在我的應用程序中,我使用ReaderWriterLockSlim
來同步來自list<>
的讀寫操作。ReaderWriterLockSlim EnterReadLock()通過幾個方法運行,其中一個在BackgroundWorker中運行
在以下示例中,讀取列表是在所有3個子方法內執行的,因此這3個應打包爲ReadLock
。問題在於SubMethod3
是通過BackgroundWorker
調用的(因爲它包含冗長的計算),所以在MainMethod1的finally塊中的ExitReadLock()
可能在子方法3由BackgroundWorker
(獨立線程)完成之前調用。因此SubMethod3
中的代碼並不真正受鎖的保護。
我考慮過的是在每個子方法中使用一個鎖,所以Submethod3
會有自己的鎖,當BackgroundWorker
完成時會釋放鎖。這種方法的問題是另一個線程可能會在子方法的調用之間進入,因爲每個線程都會在完成時釋放鎖。
我的問題是:ReadLock
如何用於保護更多的線程?
ReaderWriterLockSlim synchronizationLock = new ReaderWriterLockSlim();
public void MainMethod1()
{
synchronizationLock.EnterReadLock();
try
{
SubMethod1(); //Run on UI thread
SubMethod2(); //Run on UI thread
myBackgroundWorker.RunWorkerAsync();
}
finally
{
synchronizationLock.ExitReadLock();
}
}
private void myBackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
SubMethod3(); //Run on separate thread
}
嗯,不,你從MainMethod1()調用SubMethod3。如果你還*從BGW調用它,那麼它必須全部使用* synchronizationLock *。 –
好的,我更新了這個問題,以便更清楚我已經在做什麼。 – JohnSaps
@ downvoter:爲什麼?問題不清楚,還是我完全失望?沒有評論,沒有人會變得更聰明。 – JohnSaps