학습 의 길 3: 단일 스 레 드 와 의뢰 및 이벤트 사용자 정의 Timer 류 활용

27756 단어 timer
일주일 간 의 스 레 드 학습 을 통 해 스 레 드 에 대한 인식 은 아직 안개 속 에 있 는 것 같 지만 이 중간 에 의뢰 와 사건 에 대해 어느 정도 인식 하고 깨 달 았 습 니 다!
여기 서 나의 학습 느낌 을 기록 하고 큰 소의 블 로그 글 을 몇 개 첨부 하면 가 볼 수 있 습 니 다!
  http://www.cnblogs.com/kevin-moon/archive/2009/04/24/1442469.html
  http://www.cnblogs.com/rentiansheng/archive/2011/02.html , 스 레 드 지식 은 여전히 깊이 있 습 니 다!
자, 본론 으로 들 어가 자. Let 's Go...
1. 머리말
시간 간격 으로 데 이 터 를 동적 으로 새로 고치 거나 동적 시 계 를 만 들 려 고 할 때 (이러한 수요 와 유사). NET Framework 의 Timer 류 를 사용 하 는 것 을 생각 하 게 되 고. NET Framework 에 서 는 세 가지 유형 으로 나 뉜 다.
· System.Windows.Forms.Timer     
· System.Threading.Timer
· System.Timers.Timer
상기 세 가지 종류의 사용 에 대해 여러분 은 다소 접촉 하고 이 벤트 를 등록 하 며 실행 할 방법 을 연결 한 다음 에 시계의 간격 을 설정 하면 프로그램 이 실 행 될 때 자동 으로 터치 합 니 다!
 
2. 생각
만약 에 여러분 이 위의 세 가지 종 류 를 사용 하지 않 는 다 면 몇 초 간격 으로 데 이 터 를 갱신 하거나 동적 시 계 를 만 드 는 다른 방법 이 있 지 않 을까요?
답 은 확실 해!
  
3. 사고방식
활용 한 지식:
① 의뢰
② 사건
③ 스 레 드
실현 방향:
① 클 라 이언 트 에서 이벤트 등록 을 통 해 실행 할 방법 을 연결 합 니 다.
② 서버 에서 이 벤트 를 수행 하 는 방법 을 무한 순환 환경 에 두 도록 합 니 다.
③ 스 레 드 를 만 들 고 이 벤트 를 수행 하 는 방법 을 스 레 드 에 전달 하 며 스 레 드 를 배경 으로 실행 하고 스 레 드 의 간격 (Thread. sleep) 으로 설정 합 니 다.
④ 마지막 으로 이 스 레 드 를 호출 하면 즉시 새로 고침 이 가능 합 니 다.
그림:
     学习之路三:关于运用单线程和委托以及事件自定义Timer类
 
4. 코드 구현
 1      /*
2 , ,
3 *
4 */

5 public delegate void CustomHander(object sender, CustomEventArgs e); // → + Handler,
6 public class CustomTimer : IDisposable

7 {
8 private CustomHander _customHandler; //
9 private int _distance; //
10 private int _start; //
11 private bool _flag = true; // , True
12 private Thread _thread; //
13 private CustomEventArgs _customEventArgs = new CustomEventArgs("Yang Cao Gui"); //
14

15 public event CustomHander CustomTick;
16
17 public CustomTimer() //
18 : this(null, 1000, 0)

19 { }
20 public CustomTimer(int distance)
21 : this(null, distance, 0)
22 { }
23 public CustomTimer(int distance, int start)
24 : this(null, distance, start)
25 { }
26 public CustomTimer(CustomHander handler, int distance, int start)
27 {
28 this._customHandler = handler;
29 this._distance = distance;
30 this._start = start;
31 Connect(); //
33 }

34
35 private void OnCustomTick() // On + , ,.NET Framework
36 {

37 try
38 {
39 while (true) //
40 {

41 if (this._flag == false) //
42 {

43 return;
44 }
45 Thread.Sleep(this.DistanceTime);
46 if (this._customHandler == null)
47 {
48 this._customHandler = CustomTick; //
49 }

50 if (this._customHandler != null)
51 {
52 this._customHandler(this, _customEventArgs);
53 }
55 }
56 }
57 catch (Exception ex)
58 {
59 throw ex;
60 }
61 }
62
63 private void Connect() // Timer , !
64 {

65 if (this.StartTime > 0)
66 {
67 Thread.Sleep(this.StartTime);
68 }
69 if (this._thread == null) //
70 {

71 this._thread = new Thread(new ThreadStart(OnCustomTick)); //
72 this._thread.IsBackground = true; //
73 this._thread.Start();

74 }
75 }
76
77 public void Start() //
78 {

79 this._flag = true;
80 //
81 this.Connect();

82 }
83
84 public void Stop() //
85 {

86 this._flag = false;
87 }
 94         public void Dispose()       //    
95 {

96 //this._thread.IsBackground = false;
97 this._thread.Abort();

98 this.Dispose();
99 GC.Collect();
111 }
112
113 public int DistanceTime //
114 {

115 get { return this._distance; }
116 set { this._distance = value; }
117 }
118
119 public int StartTime //
120 {

121 get { return this._start; }
122 set { this._start = value; }
123 }
124 }
125
126 public class CustomEventArgs : EventArgs // , EventArgs,
127 {
128 public CustomEventArgs(string message)
129 {
130 this.Message = message;
131 }
132
133 public string Message
134 { get; set; }
135 }

 클 라 이언 트 호출 (Winform 프로그램):
     学习之路三:关于运用单线程和委托以及事件自定义Timer类     
 1     public partial class Form1 : Form
2 {
3 MyCustom.CustomTimer customTimer;    //
4
5 public Form1()
6 {
7 InitializeComponent();
8 }
9
10 private void Form1_Load(object sender, EventArgs e)
11 {
12 this.textBox1.Text = DateTime.Now.ToString();
13 customTimer = new MyCustom.CustomTimer(1000, 0);  // ,
14 customTimer.CustomTick += new MyCustom.CustomHander(customTimer_CustomTick); //
15 this.button1.Click += new EventHandler(button1_Click);
16 this.button2.Click += new EventHandler(button2_Click);
17 //customTimer.Close();
18 }

19
20 void customTimer_CustomTick(object sender, MyCustom.CustomEventArgs e)
21 {
22 this.textBox1.Text = String.Empty;
23 this.textBox1.Text = DateTime.Now.ToString();
25 }

27
28 void button2_Click(object sender, EventArgs e)    //
29 {
30 customTimer.Stop();
32 }
33
34 void button1_Click(object sender, EventArgs e)    //
35 {
36 customTimer.Start();
37 }
38 } 

     
5. 총화
이 작은 실험 을 통 해 저 는. NET Framework 의 의뢰 와 사건 체제 에 대해 어느 정도 알 게 되 었 습 니 다. 특히 → void button2_Click (object sender, EventArgs e) 의 두 매개 변수 에 대한 이 해 는 더욱 제거 되 었 다 는 인식 을 가지 게 되 었 습 니 다!    
     学习之路三:关于运用单线程和委托以及事件自定义Timer类
두 매개 변수 에 대한 이해:
① object sender: 사건 을 수행 할 때 이 매개 변수의 값 은 'this' 입 니 다. 즉, 이 매개 변 수 는 이 사건 을 포함 하 는 대상 입 니 다. 이 를 사용 하려 면 강제 전환 을 할 수 있 습 니 다. object 형식 이기 때 문 입 니 다. 예 를 들 어:
Button btn = (Button)sender as Button;  MessageBox.Show(btn.Text); 
이것 은 Button 단추 의 전환 입 니 다. 다른 컨트롤 도 이렇게 합 니 다. 특히 GridView 를 사용 할 때 이런 전환 이 필요 합 니 다!
     ② EventArgs e: 이것 은 사실 이해 하기 쉽 습 니 다. 대부분의 컨트롤 은 자신의 실체 정보 류 가 있 기 때문에 이 대상 이 사건 을 통 해 정 보 를 전달 하고 싶다 면 이 정보 류 를 통 해 만 전달 되 고 모든 정보 류 는 EventArgs 와 같은 기 류 를 계승 해 야 합 니 다!예:
void button2_Click (object sender, EventArgs e) {customTimer. Stop (); Button btn = (Button) sender as Button; Message Box. Show (btn. Text); / / 단 추 는 자신의 정보 류 가 없 기 때문에 EventArgs 라 는 기본 클래스 로 직접 전 달 됩 니 다. 따라서 정보 가 없습니다!}
관심 이 있다 면 Reflector 를 사용 하여 다른 컨트롤 의 정보 류 를 볼 수 있 습 니 다!
 
6. 의문
처음에 제 가 테스트 를 할 때 프로그램 이 몇 번 실행 되면 → "TestCustomTimer. vshost. exe" 라 는 파일 이 다른 프로 세 스에 서 사용 되 고 있 습 니 다. 그리고 작업 관리자 로 강제로 닫 히 지만 끄 면 계속 나타 납 니 다!
마지막 으로 항목 속성 우 클릭 → Debug 메뉴 찾기 → 
     学习之路三:关于运用单线程和委托以及事件自定义Timer类
이렇게 해서 해결 되 었 습 니 다. 그러나 저 는 자 료 를 찾 아 봤 습 니 다. 제 가 자원 을 방출 하지 않 았 기 때 문 이 라 고 말 했 습 니 다. 저 는 제 스 레 드 자원 이 방출 되 지 않 았 을 수도 있다 는 것 을 알 고 있 습 니 다. 하지만 저 는 몇 밤 동안 해결 할 방안 을 생각 하지 못 했 습 니 다. 사실은 이 일 을 하면 제 가 의뢰, 스 레 드, 사건 에 대한 이 해 를 추진 할 수 있 을 뿐 다른 것 도 아무것도 없습니다!
만약 여러분 이 어떤 상황 인지 알 고 있다 면, 저 에 게 메 시 지 를 남 겨 주세요!Thanks!
인터넷 상의 한 형제 가 나 에 대한 지도 에 감사 드 립 니 다!
학습 에서 깊이, 실천 에서 향상, 여기 서 여러분 의 설날 즐거움 을 기원 합 니 다. 며칠 전에 인터넷 에서 영화 표를 공동 구 매 했 기 때문에 설날 에 영 화 를 보 러 가 려 고 합 니 다. 멋 지게, o (∩ ∩) o......

좋은 웹페이지 즐겨찾기