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

C#多線程的應用

編輯:C#入門知識

使用多線程的幾種方式

不需要傳遞參數,也不需要返回參數

需要傳遞單個參數

使用專門的線程類(常用)

使用匿名方法(常用)

使用委托開啟多線程(多線程深入)

線程的狀態控制

前台線程與後台線程

由線程類(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);

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