程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> 關於C# >> c#線程基礎之線程控制

c#線程基礎之線程控制

編輯:關於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();
    }
  }
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved