您的位置:首页 > 编程语言 > C#

C#多线程编程之:同步事件和等待句柄2

2012-02-08 16:55 543 查看
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Runtime.Remoting.Messaging;
using System.Threading;

namespace WebApplication1
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Calculate2 calc = new Calculate2();

Label3.Text = calc.Result().ToString();
}
}

class Calculate
{
//基数、数1、数2、数3
double baseNumber, firstTerm, secondTerm, thirdTerm;
//自动重置同步事件数组
AutoResetEvent[] autoEvents;
//手动重置同步事件
ManualResetEvent manualEvent;
//随机数生成器
Random randomGenerator;

public Calculate()
{
//初始化同步事件
autoEvents = new AutoResetEvent[]
{
new AutoResetEvent(false),
new AutoResetEvent(false),
new AutoResetEvent(false)
};

manualEvent = new ManualResetEvent(false);
}

void CalculateBase(object stateInfo)
{
baseNumber = randomGenerator.NextDouble();

//置事件状态为终止状态,使等待线程继续
manualEvent.Set();
}

void CalculateFirstTerm(object stateInfo)
{
double preCalc = randomGenerator.NextDouble();
//等待手动重置事件终止
manualEvent.WaitOne();
firstTerm = preCalc * baseNumber * randomGenerator.NextDouble();
//置自动事件终止信号
autoEvents[0].Set();
}

void CalculateSecondTerm(object stateInfo)
{
double preCalc = randomGenerator.NextDouble();
Thread.Sleep(30000);
//等待手动重置事件终止
manualEvent.WaitOne();
secondTerm = preCalc * baseNumber * randomGenerator.NextDouble();
//置自动事件终止信号
autoEvents[1].Set();
}

void CalculateThirdTerm(object stateInfo)
{
double preCalc = randomGenerator.NextDouble();
//等待手动重置事件终止
manualEvent.WaitOne();
thirdTerm = preCalc * baseNumber * randomGenerator.NextDouble();
//置自动事件终止信号
autoEvents[2].Set();
}

public double Result(int seed)
{
randomGenerator = new Random(seed);

//将待执行工作加入线程
//ThreadPool.QueueUserWorkItem(new WaitCallback(CalculateBase));
//ThreadPool.QueueUserWorkItem(new WaitCallback(CalculateFirstTerm));
//ThreadPool.QueueUserWorkItem(new WaitCallback(CalculateSecondTerm));
//ThreadPool.QueueUserWorkItem(new WaitCallback(CalculateThirdTerm));

Thread ThreadBase = new Thread(CalculateBase);
ThreadBase.Start();

Thread ThreadFirst = new Thread(CalculateFirstTerm);
ThreadFirst.Start();

Thread ThreadSecond = new Thread(CalculateSecondTerm);
ThreadSecond.Start();

Thread ThreadThird = new Thread(CalculateThirdTerm);
ThreadThird.Start();

//等待所有自动事件终止
WaitHandle.WaitAll(autoEvents);
//重置手动事件为非终止状态
manualEvent.Reset();

return firstTerm + secondTerm + thirdTerm;
}
}

class Calculate2
{
double baseNumber, totalNumber;
List<AutoResetEvent> autoEvents;
ManualResetEvent manualEvent;
Random randomGenerator;

public Calculate2()
{
//初始化同步事件
autoEvents = new List<AutoResetEvent>();

for (int i = 0; i < 3; i++)
{
autoEvents.Add(new AutoResetEvent(false));
}

manualEvent = new ManualResetEvent(false);
}

void CalculateBase()
{
baseNumber = 0;// new Random().Next();

//置事件状态为终止状态,使等待线程继续
manualEvent.Set();
}

void CalculateTerm(object i)
{
int j = (int)i;
//等待手动重置事件终止
manualEvent.WaitOne();
lock (this)
{
totalNumber += j + baseNumber;
}
//置自动事件终止信号
autoEvents[j].Set();
}

public double Result()
{
Thread ThreadBase = new Thread(CalculateBase);
ThreadBase.Start();

for (int i = 0; i < 3; i++)
{
Thread ThreadFirst = new Thread(new ParameterizedThreadStart(CalculateTerm));
ThreadFirst.Start(i);
}

//等待所有自动事件终止
WaitHandle.WaitAll(autoEvents.ToArray());
//重置手动事件为非终止状态
manualEvent.Reset();

return totalNumber;
}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐