-1

在我的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);
     }
 }

杂项:人们是否可以发表评论我可能出错的地方,而不是仅仅投反对票而不给出理由

4

1 回答 1

1

为了不时检查队列,您需要设置一个计时器:

 CheckTimer = new System.Threading.Timer(CheckQueue, null, TimeSpan.FromMilliseconds(1000), TimeSpan.FromMilliseconds(1000));

您应该在初始化服务时创建计时器。

在您的 CheckQueue 方法中,您将需要一个循环来处理队列中的所有数据。

private void CheckQueue(object dummy)
{
    // The dummy is null, its there because it is a Timer event.
    AppIP.Connect(50);

    AppInfo appInfo;
    while(AppQ.TryDequeue(out appInfo))
    {
        // Process the appInfo
    }
}

请注意,来自 System.Threading 的计时器将在不同的线程中运行,即使当前事件仍在运行,下一个事件的处理也会发生!

于 2017-07-13T09:35:59.920 回答