在我的CheckQueue()
方法中,我想做的是不断地从队列中读取(通过调用AppQ.Connect(Time)
)和其中的TryDequeue
每个项目。经过一段时间(可能是一分钟左右)后,我想回到队列 - 再次连接,检查它是否有一些元素(AppQ.Count
),读取它们(by TryDequeue()
)并无限期地执行此过程。
这是针对将成为 Windows 服务(目前是用于测试目的的 Windows 窗体应用程序)的应用程序,该服务将每天运行一整天,并在某些机器上运行的任何应用程序出现停机时提醒我们开发人员。我知道我将不得不使用 aWhile-Loop
但我不确定是使用Timer
基于事件还是Stopwatch
与它一起使用。
更多上下文:我也有一种感觉,我应该考虑使用do-while
循环而不是while
查看,因为前者执行一些操作(通过调用加载消息AppQ.Connect(time)
)然后检查退出条件(if AppQ.Count <= 0
),而 awhile
则相反。
BlockingCollection<T>
考虑到它是线程安全的,我应该使用它吗?
有什么建议么?
public class APPInfo
{
public String Machine { get; set; }
public String IP { get; set; }
public String Port { get; set; }
public String App { get; set; }
public ClientApplicationState Status { get; set; }
public String Message { get; set; }
public String TimeStamp { get; set; }
public String CPUUse { get; set; }
public String MemoryUse { get; set; }
public String TotalCPUUse { get; set; }
public String TotalMemoryUse { get; set; }
}
public static ConcurrentQueue<APPInfo> AppQ = new ConcurrentQueue<APPInfo>();
public static void Connect(Int16 Time)
{
AppQ.Enqueue(new APPInfo { Machine = "One", IP = "127.0.0.1", Port = "23000", App = "TestServer1", Status = ClientApplicationState.OK, TimeStamp = DateTime.Now.ToString(), CPUUse = "80.0", MemoryUse = "81.0", TotalCPUUse = "86.0", TotalMemoryUse = "87.0" });
AppQ.Enqueue(new APPInfo { Machine = "One", IP = "127.0.0.1", Port = "23001", App = "TestServer2", Status = ClientApplicationState.ERROR, TimeStamp = DateTime.Now.ToString(), CPUUse = "82.0", MemoryUse = "83.0", TotalCPUUse = "88.0", TotalMemoryUse = "89.0" });
AppQ.Enqueue(new APPInfo { Machine = "Two", IP = "127.0.0.2", Port = "23002", App = "TestServer3", Status = ClientApplicationState.WARNING, TimeStamp = DateTime.Now.ToString(), CPUUse = "84.0", MemoryUse = "85.0", TotalCPUUse = "90.0", TotalMemoryUse = "91.0" });
}
private void CheckQueue()
{
AppIP.Connect(50);
APPInfo first = new APPInfo();
if (AppIP.AppQ.Count > 0)
{
AppIP.AppQ.TryDequeue(out first);
MessageBox.Show(first.App, first.IP, first.Port, first.Status.ToString(), first.Message, first.TimeStamp, first.CPUUse, first.MemoryUse, first.Machine, first.TotalCPUUse, first.TotalMemoryUse + "\n");
}
else
{
MessageBox.Show("There is nothing in the queue to process.", "Important Note", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
}
}
杂项:人们是否可以发表评论我可能出错的地方,而不是仅仅投反对票而不给出理由