2013、10、18 通讯组件开发
情景:
情景:
主线程添加队列,子线程负责队列中消息发送。当队列中数据为空时,停止发送挂起子线程。
当主线程添加队列时,重新开启子线程进行消息发送。
方案一 但是不采用
传统Thread线程方式:首先方法过期thread.Suspend();暂不采用
。其次主子线程同时控制挂起和重启时候,可能会造成遗漏。
传统Thread线程方式:首先方法过期thread.Suspend();暂不采用
。其次主子线程同时控制挂起和重启时候,可能会造成遗漏。
例如 子线程正在挂起,主线程网队列中添加一条数据时。子线程挂起,但是主线程刚添加的消息没有被及时发送出去
这样的话虽然可以在下次添加时启用子线程进行发送。但是刚才添加的数据没有被及时发送。因为涉及导数据的及时性因此不采用此种方式。
而且会收到线程状态瞬间切换问题操作重启线程无效
而且会收到线程状态瞬间切换问题操作重启线程无效
方案二 ResetEvent
ResetEvent 这个函数把指定的事件对象设置为无信号状态。当重新获得信号时才会继续开启发送
这样的话 在子线程中监视到队列为空时则停止队列发送。
同时每次添加新的队列信息是,都会发送开启子线程信息号。并且不受到线程的状态影响。
因此可以保证队列数据的及时性。
因此可以保证队列数据的及时性。
参照代码
ManualResetEvent manualEvent = new ManualResetEvent(false);
private void Form1_Load(object sender, EventArgs e)
{
// 开启线程
Thread th = new Thread(Test);
th.Start();
}
int c = 0;
public void Test()
{
while (true)
{
{
// 开启线程
Thread th = new Thread(Test);
th.Start();
}
int c = 0;
public void Test()
{
while (true)
{
c++;
Console.WriteLine(c);
if (c == 10000)
{
manualEvent.WaitOne();
manualEvent.Reset();
}
}
}
Console.WriteLine(c);
if (c == 10000)
{
manualEvent.WaitOne();
manualEvent.Reset();
}
}
}
// 发送叫起信号
private void button1_Click(object sender, EventArgs e)
{
manualEvent.Set();
}
private void button1_Click(object sender, EventArgs e)
{
manualEvent.Set();
}