使用多線程的幾種方式
不需要傳遞參數,也不需要返回參數
需要傳遞單個參數
使用專門的線程類(常用)
使用匿名方法(常用)
使用委托開啟多線程(多線程深入)
線程的狀態控制
前台線程與後台線程
由線程類(Thread)啟動動的線程狀態控制
由委托啟動的線程的狀態控制
多線程訪問GUI界面的處理
多線程在GUI編程時出現的問題
通過設置處理
通過委托處理(建議使用)
調用控件的Invoke和BeginInvoke方法的區別
調用消息處理程序
使用BackgroundWorker組件
線程池
線程池的作用
線程池的使用
線程同步
代碼塊同步(Monitor與lock )
介紹
使用Mutex
使用AutoResetEvent
使用ManualResetEvent與AutoResetEvent的區別
使用Interlocked進行原子操作
使用ReaderWriterLock
使用Semaphore
定時器Timer
常用的3個Timer類
的使用示例
Main([] args)
( i = 0; i < 30; i++)
threadStart = (Calculate);
thread = (threadStart);
.Sleep(2000);
.Read();
Calculate()
time = .Now;
ra = ();
.Sleep(ra.Next(10,100));
.WriteLine(time.Minute + + time.Millisecond);
Main([] args)
( i = 0; i < 30; i++)
tStart = (Calculate);
thread = (tStart);
.Sleep(2000);
.Read();
Calculate( arg)
ra = ();
.Sleep(ra.Next(10, 100));
.WriteLine(arg);
Main([] args)
mt = (100);
threadStart = (mt.Calculate);
thread = (threadStart);
(thread.ThreadState != .Stopped)
.Sleep(10);
.WriteLine(mt.Result);
.Read();
Parame { ; ; }
Result { ; ; }
MyThread( parame)
.Parame = parame;
Calculate()
ra = ();
.Sleep(ra.Next(10, 100));
.WriteLine(.Parame);
.Result = .Parame * ra.Next(10, 100);
Main([] args)
Parame = 100;
Result = 0;
threadStart = (()
ra = ();
.Sleep(ra.Next(10, 100));
.WriteLine(Parame);
thread = (threadStart);
(thread.ThreadState != .Stopped)
.Sleep(10);
.WriteLine(Result);
.Read();
requestCompleted( asyncResult)
(asyncResult == || asyncResult.AsyncState==)
.WriteLine();
;
hwr = asyncResult.AsyncState ;
response = ()hwr.EndGetResponse(asyncResult);
sr = (response.GetResponseStream());
str = sr.ReadToEnd();
.WriteLine(+str.Length);
Main([] args)
request =
asyncResult = request.BeginGetResponse(requestCompleted, request);
.WriteLine();
.Read();
GUI界面的處理
button1_Click( sender, e)
thread = (Flush);
;
Flush()
action = ()
.textBox1.AppendText(.Now.ToString() + );
()
(.textBox1.InvokeRequired)
.textBox1.Invoke(action);
.textBox1.AppendText(.Now.ToString() + );
.Sleep(1000);
button1_Click( sender, e)
.backgroundWorker1.RunWorkerAsync();
backgroundWorker1_DoWork( sender, e)
.progressBar1.Maximum = 100;
.progressBar1.Minimum = 0;
( i = 0; i < 100; i++)
.Sleep(10);
.backgroundWorker1.ReportProgress(i, );
backgroundWorker1_ProgressChanged( sender, e)
.progressBar1.Value = e.ProgressPercentage;
backgroundWorker1_RunWorkerCompleted( sender, e)
.Show(, , );
ThreadProc( i)
.WriteLine(i.ToString());
.Sleep(1000);
Main()
.SetMaxThreads(3, 3);
( i = 0; i < 10; i++)
.QueueUserWorkItem( (ThreadProc), + i);
.WriteLine();
.Read();
WaitAll、WaitAny、WaitOne方法的使用請參考AutoResetEvent與ManualResetEvent。
進程間的同步
mutex,從其參數的解釋中得知,第一個調用線程將得到互斥體的初始所屬權,如果不釋放的話,其他的線程得不到互斥體所有權
:Count++ 。原子操作,就是不能被更高等級中斷搶奪優先的操作。由於操作系統大部分時間處於開中斷狀態,所以,一個程序在執行的時候可能被優先級更高的線程中斷。而有些操作是不能被中斷的,不然會出現無法還原的後果,這時候,這些操作就需要原子操作。就是不能被中斷的操作。
Count = 0;
Main([] args)
( i = 0; i < 100; i++)
thread = (Method);
+ i);
.Sleep(1000 * 3);
.WriteLine( + .Count);
.ReadLine();
Method( o)
.Sleep(500);
.Increment( .Count);
.WriteLine(o.ToString());
Count = 0;
rwl = ();
Main([] args)
( i = 0; i < 10; i++)
thread = (Read);
+ i);
( i = 0; i < 10; i++)
thread = (Write);
+ i);
.ReadKey();
Read( o)
.WriteLine(o.ToString() + + .Count);
.Sleep(500);
Write( o)
.Sleep(500);
.WriteLine(o.ToString() + + (++.Count));
semaphore = (0,
Main([] args)
( i = 0; i < 10; i++)
thread = (Method);
+ i);
.WriteLine();
.Read();
Method( o)
.Sleep(1000);
.WriteLine(o.ToString());
邊界的資源使用。
Main([] args)
seamphore = (5, 10, );
.WriteLine();
.WriteLine();
.WriteLine();
.WriteLine();
.Read();
Timer
Main([] args)
t = System.Timers.(1000);
(Method);
;
;
.WriteLine();
.Read();
Method( source, e)
.WriteLine(+e.SignalTime);