线程处于睡眠状态时通过另一种方法动态改变变量

时间:2015-07-21 22:33:39

标签: c# multithreading

我有一个程序将对象存储到优先级队列中,并在一天中的某些时间将它们Dequeue通过TCP连接发送。

现在,我正在通过调用thread.sleep来执行此操作,直到下一个优先级队列的下一个运行时间为止。

        while (MyQueue.NumItems > 0)
        {
            int secondsnow = (int)DateTime.Now.TimeOfDay.TotalSeconds;
            int nextTime = MyQueue.Peek().gettime();
            // Gets the time in seconds when the next object on the queue is to be sent
            Thread.Sleep(TimeSpan.FromSeconds(nextTime - secondsnow));
            // Sleeps until that time
            tcpclient.SendMessage(stream, MyQueue.Dequeue());
            // Send that data over my connection
        }

我的下一个目标是将TCP侦听器合并到程序中,该程序将等待客户端以对象的形式发送数据,以便在程序运行时动态地将其放入我的优先级队列。 TCP侦听器本身是一个阻塞调用,只要上述代码需要在指定时间将对象出列,就需要解除阻塞。

这是TCP侦听器代码的粗略概念:

while(true) 
  {
    // Perform a blocking call to accept requests. 

    TcpClient client = server.AcceptTcpClient();            
    Console.WriteLine("Connected!");

    // Get a stream object for reading and writing
    NetworkStream stream = client.GetStream();

    int i;

    // Loop to receive all the data sent by the client. 
    while((i = stream.Read(bytes, 0, bytes.Length))!=0) 
    {   
      // Process data and add to the priority queue
      MyQueue.enqueue(new myObject(bytes));
    }
    // Shutdown and end connection
    client.Close();
  }
}

对我来说,同时执行两个循环的最佳方法是什么,其中一个是阻塞调用而另一个是时间相关的,同时防止两个循环访问优先级队列的任何死锁情况?我是多线程的新手,所以我对线程启动和阻塞的过程非常困惑。

0 个答案:

没有答案