分享
 
 
 

多线程编程学习笔记(五)

王朝other·作者佚名  2006-01-10
窄屏简体版  字體: |||超大  

多线程编程学习笔记(五)

处理周期事件

1、System.WinForms.Timer

Timer的Tick事件代码:

Interlocked.Increment(ref _count);

2、ThreadPool

A.生成WaitOrTimerCallback事例

B.生成一个同步对象

C.添加到线程池

例1:

/*RegisterWaitForSingleObject

下面的示例演示了几种线程处理功能。

使用 RegisterWaitForSingleObject 将需要执行的任务以 ThreadPool 线程的方式排队。

使用 AutoResetEvent 发出信号,通知执行任务。

用 WaitOrTimerCallback 委托处理超时和信号。

用 RegisteredWaitHandle 取消排入队列的任务。

*/

using System;

using System.Threading;

// TaskInfo contains data that will be passed to the callback

// method.

public class TaskInfo {

public RegisteredWaitHandle Handle = null;

public string OtherInfo = "default";

}

public class Example {

public static void Main(string[] args) {

// The main thread uses AutoResetEvent to signal the

// registered wait handle, which executes the callback

// method.

AutoResetEvent ev = new AutoResetEvent(false);

TaskInfo ti = new TaskInfo();

ti.OtherInfo = "First task";

// The TaskInfo for the task includes the registered wait

// handle returned by RegisterWaitForSingleObject. This

// allows the wait to be terminated when the object has

// been signaled once (see WaitProc).

ti.Handle = ThreadPool.RegisterWaitForSingleObject(

ev,

new WaitOrTimerCallback(WaitProc),

ti,

100,

false

);

// The main thread waits three seconds, to demonstrate the

// time-outs on the queued thread, and then signals.

Thread.Sleep(3100);

Console.WriteLine("Main thread signals.");

ev.Set();

// The main thread sleeps, which should give the callback

// method time to execute. If you comment out this line, the

// program usually ends before the ThreadPool thread can execute.

Thread.Sleep(1000);

// If you start a thread yourself, you can wait for it to end

// by calling Thread.Join. This option is not available with

// thread pool threads.

}

// The callback method executes when the registered wait times out,

// or when the WaitHandle (in this case AutoResetEvent) is signaled.

// WaitProc unregisters the WaitHandle the first time the event is

// signaled.

public static void WaitProc(object state, bool timedOut) {

// The state object must be cast to the correct type, because the

// signature of the WaitOrTimerCallback delegate specifies type

// Object.

TaskInfo ti = (TaskInfo) state;

string cause = "TIMED OUT";

if (!timedOut) {

cause = "SIGNALED";

// If the callback method executes because the WaitHandle is

// signaled, stop future execution of the callback method

// by unregistering the WaitHandle.

if (ti.Handle != null)

ti.Handle.Unregister(null);

}

Console.WriteLine("WaitProc( {0} ) executes on thread {1}; cause = {2}.",

ti.OtherInfo,

Thread.CurrentThread.GetHashCode().ToString(),

cause

);

}

}

例2:

using System;

using System.Threading;

class State

{

private int nCalledTimes = 0;

public void Called()

{

Interlocked.Increment(ref nCalledTimes);

}

public int CalledTimes

{

get

{

return nCalledTimes;

}

}

}

class App

{

static public void PeriodicMethod(object state , bool timeOut)

{

// timeOut为false时,说明等待有效,否则超时

Console.WriteLine("\nThread {0}开始处理定时事件",Thread.CurrentThread.GetHashCode());

if(!timeOut)

Console.WriteLine("获得等待信号");

else

Console.WriteLine("超时事件发生");

if(state!=null)

{

((State)state).Called();

Console.WriteLine("调用了{0}次",((State)state).CalledTimes);

}

Thread.Sleep(100);

Console.WriteLine("Thread {0}处理定时事件完毕\n",Thread.CurrentThread.GetHashCode());

}

static public void Main()

{

AutoResetEvent myEvent = new AutoResetEvent(false);

WaitOrTimerCallback waitOrTimerCallback = new WaitOrTimerCallback(App.PeriodicMethod);

int timeout = 1000;

bool executeOnlyOnce = false;

State state = new State();

ThreadPool.RegisterWaitForSingleObject(myEvent , waitOrTimerCallback , state ,timeout,executeOnlyOnce);

//Thread.Sleep(10000);

myEvent.Set();

Console.WriteLine("按任意键退出");

Console.ReadLine();

}

}

3、System.Threading.Timer

A.实例化一个TimerCallback代理callback

B.创建一个System.Threading.Timer实例timer

C.如果有必要,调用 timer.Change重新设置timer的durTime和period

D.用timer.Dispose释放timer

using System;

using System.Threading;

class State

{

private int threadID = -1;

private AutoResetEvent firstTimerFired = null;

public State(int threadID , AutoResetEvent firstTimerFired)

{

this.threadID = threadID;

this.firstTimerFired = firstTimerFired;

}

public void Show()

{

Console.WriteLine("thread.HashCode={0}\tthreadID={1}在工作",Thread.CurrentThread.GetHashCode(),threadID);

}

public AutoResetEvent FirstTimerFired

{

get

{

return firstTimerFired;

}

set

{

firstTimerFired = value;

}

}

}

class App

{

public static void Main()

{

Console.WriteLine("每2秒执行一次时钟事件");

TimerCallback callback = new TimerCallback(App.CheckStatus);

Timer timer1 = new Timer(callback , null ,1000 ,2000);

AutoResetEvent firstTimerFired = new AutoResetEvent(false);

State state = new State(2,firstTimerFired);

Timer timer2 = new Timer(callback ,state , 5000 ,0);//定时器事件只触发一次,period为0

firstTimerFired.WaitOne();

Console.WriteLine("按回车继续...");

Console.ReadLine();

timer2.Change(2000,1000);

Console.WriteLine("按回车继续...");

Console.ReadLine();

timer1.Dispose();

timer2.Dispose();

}

static void CheckStatus(object state)

{

if (state !=null)

{

((State)state).Show();

if(((State)state).FirstTimerFired != null)

((State)state).FirstTimerFired.Set();

}

else

{

Console.WriteLine("tread.HashCode = {0}\tthreadID={1}在工作",Thread.CurrentThread.GetHashCode(),-1);

}

}

}

4、System.Timers.Timer

基于服务器的计时器的关键编程元素

Timer 组件引发一个名为 Timer.Elapsed 的事件。您可以为这个事件创建处理程序来执行处理要发生的一切。

Timer 组件的一些更重要的属性和方法还包含:

Interval 属性用来设置引发事件的时间范围,以毫秒计。例如,值为 1000 的时间间隔将一秒钟引发一次事件。

AutoReset 属性决定在给定时间间隔过去之后计时器是否继续引发事件。如果设置成 true,计时器继续重新计算时间间隔并引发事件。如果为 false,它在时间间隔过去后只引发一次事件,然后停止。

Start 方法将计时器的 Enabled 属性设置为 true,它允许计时器开始引发事件。如果计时器已经是启用状态,则调用 Start 方法将重置该计时器。

Stop 方法将计时器的 Enabled 属性设置成 false,以防止计时器再引发事件。

A.创建System.Timers.Timer对象kicker

B.设置周期

C.设置AutoReset为true

D.设置kicker的Elapsed事件

E.启动kicker

F.如果需要,可以重新设置kicker的Interval属性

G.停止记时器

using System;

using System.Timers;

using System.Threading;

class App

{

private static DateTime stopTime = new DateTime(2005,4,2);

static void ElapsedHandler(object sender , ElapsedEventArgs e)

{

if (DateTime.Compare(e.SignalTime , stopTime) > 0 )

{

Console.WriteLine("Thread {0} 处理定事事件",Thread.CurrentThread.GetHashCode());

Thread.Sleep(100);

}

}

static public void Main()

{

System.Timers.Timer kicker = new System.Timers.Timer();

kicker.Interval =1000;

kicker.AutoReset = true;

kicker.Elapsed += new ElapsedEventHandler(ElapsedHandler);

kicker.Start();

Thread.Sleep(2100);

Console.WriteLine("改变时间间隔");

kicker.Interval = 2000;

Thread.Sleep(2100);

Console.WriteLine("结束定事器");

//kicker.Stop();

stopTime = DateTime.Now;

Thread.Sleep(2100);

Console.WriteLine("重新启动定事器");

kicker.Start();

Thread.Sleep(8100);

Console.WriteLine("按任意键退出");

//Console.ReadLine();

//Thread.Sleep(14100);

kicker.Stop();

stopTime = DateTime.Now;

}

}

System.Winforms.Timer、System.Threading.Timer、System.Timers.Timer,通过设置定时周期、定时事件、可以启动、终止、再启动定时器、重新设置定时器属性等。功能依次增强。

ThreadPool一旦设置好时钟属性并启动后,就不能对定时器进行控制。

《.net核心技术-原理与架构》

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有