C#BlockingCollection返回相同的对象

时间:2016-02-24 10:57:20

标签: c# multithreading

我正在处理需要读取数据并将其存储在单独数据库中的应用程序,为此我创建了2个Threads,一个将每10秒填充一次BlockingCollection,另一个将读出相应地收集和更新数据库。

出现的问题是:每当我尝试TryTake过快时,BlockingCollection将返回所有元素,但所有元素彼此相同。我检查了输入,对象确实填充正确。

每当我添加System.Threading.Thread.Sleep(10);时,问题就消失了。我似乎没必要实施这样的机制,任何想法?

代码:

static void ReadServers()
{
    XmlDocument xmlInput = new XmlDocument();
    xmlInput.Load(NServerAPI);
    XmlElement root = xmlInput.DocumentElement;
    XmlNodeList nodes = root.SelectNodes("hoststatus");

    foreach (XmlNode node in nodes)
    {
        NServer server = new NServer();
        server.HostName = node.SelectSingleNode("name").InnerText;
        serverStatusQueue.Add(server);
    }
}

static void ServerQueueReader()
{
    NServer server = new NServer();
    while (serverStatusQueue.TryTake(out server, Int32.MaxValue))
    {
        Console.WriteLine(server.HostName);
    }
}

public class NServer
{
   static string hostName;

   public string HostName
   {
       get { return NServer.hostName; }
       set { NServer.hostName = value; }
   }
   static string statusText;

   public string StatusText
   {
       get { return NServer.statusText; }
       set { NServer.statusText = value; }
   }
   static int currentState;

   public int CurrentState
   {
       get { return NServer.currentState; }
       set { NServer.currentState = value; }
   }

   static int hostID;

   public int HostID
   {
       get { return NServer.hostID; }
       set { NServer.hostID = value; }
   }
}

0 个答案:

没有答案