zoukankan      html  css  js  c++  java
  • c#线程基础之线程控制

    用ManualResetEvent和AutoResetEvent可以很好的控制线程的运行和线程之间的通信。msdn的参考为: http://msdn.microsoft.com/zh-cn/library/system.threading.autoresetevent.aspx http://msdn.microsoft.com/zh-cn/library/system.threading.manualresetevent.aspx 下面我写个例子,这里模拟了一个线程更新数据,两个线程读取数据。更新的时候需要阻止读取的两个现成工作。而另外还有一个信号量来控制线程的退出。

    using System;
    
    using System.Collections.Generic;
    
    using System.ComponentModel;
    
    using System.Data;
    
    using System.Drawing;
    
    using System.Text;
    
    using System.Windows.Forms;
    
    
    
    namespace WindowsApplication35
    
    {
    
        public partial class Form1 : Form
    
        {
    
            public Form1()
    
            {
    
                InitializeComponent();
    
            }
    
    
    
            System.Threading.ManualResetEvent mEvent = new System.Threading.ManualResetEvent(true);
    
    
    
            //判断线程安全退出的信号量
    
            System.Threading.ManualResetEvent mEventStopAll = new System.Threading.ManualResetEvent(false);
    
    
    
            //*******ManualResetEvent的用法。
    
            private void button1_Click(object sender, EventArgs e)
    
            {
    
                //一个线程模拟写入
    
                new System.Threading.Thread(invokeWrite).Start();
    
                //两个线程模拟读取
    
                new System.Threading.Thread(invokeRead).Start();
    
                new System.Threading.Thread(invokeRead).Start();
    
            }
    
    
    
            private void invokeWrite()
    
            {
    
                for (int i = 0; i < 100; i++)
    
                {
    
                    //判断线程安全退出
    
                    if (mEventStopAll.WaitOne(10, false) == true) break;
    
                    //设置信号量,假设更新数据需要2秒,每更新一次暂停2秒.
    
                    mEvent.Reset();
    
                    Console.WriteLine("正在更新...");
    
                    System.Threading.Thread.Sleep(2000);
    
                    mEvent.Set();
    
                    System.Threading.Thread.Sleep(2000);
    
                }
    
            }
    
            private void invokeRead()
    
            {
    
                while (mEvent.WaitOne() == true)
    
                {
    
                    //判断线程安全退出
    
                    if (mEventStopAll.WaitOne(10, false) == true) break;
    
                    //假设读取一体数据用10毫秒.他需要判断信号量开关.
    
                    Console.WriteLine("读取一条数据:");
    
                    System.Threading.Thread.Sleep(10);
    
                }
    
            }
    
    
    
            private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    
            {
    
                mEventStopAll.Set();
    
            }
    
        }
    
    }
    
    
  • 相关阅读:
    我的WCF之旅(1):创建一个简单的WCF程序
    网页设计中颜色的搭配
    CSS HACK:全面兼容IE6/IE7/IE8/FF的CSS HACK
    UVa 1326 Jurassic Remains
    UVa 10340 All in All
    UVa 673 Parentheses Balance
    UVa 442 Matrix Chain Multiplication
    UVa 10970 Big Chocolate
    UVa 679 Dropping Balls
    UVa 133 The Dole Queue
  • 原文地址:https://www.cnblogs.com/cl1024cl/p/6204923.html
Copyright © 2011-2022 走看看