[英]Lock in multi-threading
class Port
{
static readonly object locker = new object();
List<Connection> listOfConnections = new List<Connection>
public void MethodX()
{
Thread.Sleep(10000);
lock(locker)
{
listOfConnections.RemoveAt(0);
}
}
public void ReceiveFromSwitch()
{
lock(locker)
{
if(listOfConnections.Count == 0) listOfConnections.Add(new Connection());
if(listOfConnections.Count == 1) MessageBox.Show("Whatever");
new Thread(()=>MetohodX()).Start();
}
}
}
那是我的代碼,兩個不同的線程調用方法ReceiveFromSwitch()。 我的目標是獲得一個“無論如何”消息框。 首先啟動一個線程。 它進入ReceiveFromSwitch,鎖定資源,第二個線程正在等待資源被釋放。 在列表上添加了一個連接,該連接進入MethodX()並為隊列中的線程釋放方法ReceiveFromSwitch。 第二步進入方法。 計數等於1,因此顯示消息。
沒用 它給出兩個消息“ Whatever”。 我該如何解決?
你忘了一個。
if(listOfConnections.Count == 0) listOfConnections.Add(new Connection());
else if(listOfConnections.Count == 1) MessageBox.Show("Whatever");
//or better yet
if (listOfConnections.Any())
{
MessageBox.Show("Whatever");
}
else
{
listOfConnections.Add(new Connection());
}
發生的情況是,第一個線程進入並向列表添加連接,然后立即顯示該消息,因為Count
現在為1。第二個線程進入,並按預期顯示了第二條消息。
您的代碼還有另一個問題。 第二個線程也會觸發MethodX
,當它在10秒后執行時,它將嘗試從已經為空的列表中刪除索引0,從而導致ArgumentOutOfRangeException
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.