簡體   English   中英

鎖定多線程

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

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