1. 程式人生 > >c#學習筆記之十五 目前多執行緒執行函式的思路

c#學習筆記之十五 目前多執行緒執行函式的思路

1.如果不用傳遞引數和返回結果,僅僅是執行程式碼體,則直接在新建執行緒的時候傳遞函式的名稱。

Thread th = new Thread(FunctionName);

完整程式碼如下所示,新建子執行緒開始後,主執行緒立即返回,主執行緒與子執行緒同時執行,在螢幕上列印內容。

using System;
using System.Threading;

namespace EXE
{

class F				{
	public static void Count()
		{
		int max;
		max = 10;
		while( max > 0 )
			{
			max -- ;
			Thread.Sleep(1000);
			Console.WriteLine("child thread count is {0}",max);
			}	
		}
			
					}
class Program{
public static void Main(string[] args)
	{
	Console.WriteLine("this is in main thread");
	Thread th = new Thread(F.Count);//在新建執行緒的時候傳遞函式名稱.
								//設定在新執行緒中要執行的函式.
	th.Start();//新執行緒開始執行.
				//主執行緒立即返回,往下執行.
				//當然,與此同時,子執行緒也在執行
	int max;
	max = 10;
	while(max >= 0)
		{
		Console.WriteLine("main thread count is {0}",max--);
		Thread.Sleep(1000);
		}
	Console.WriteLine("Press any key to continue . . . ");
	Console.ReadKey(true);
	}
			}
}


我們可以看到,在螢幕上同時列印主執行緒和子執行緒的內容。為什麼是在一個黑框框呢,因為只有一個程序。如果是兩個程序暨兩個執行程式的話,是兩個黑框框的。從這一點可以看出多執行緒和多程序的區別。
2.如果需要傳遞引數或(和)返回結果,那麼就使用函式代表的BeginInvoke()和EndInvoke()方法,中間需要一個IAsyncResult(非同步結果物件)作為轉接的介面。

完整程式碼如下

using System;
using System.Threading;

namespace invoke
{
delegate int Func(int x);
class F			{
	public static int Inrement(int x)
		{
		Thread.Sleep(x*1000);//x 有多大,就停留幾秒.一次停夠.
		Console.WriteLine("incrementing");
		return x+1;//停頓若干秒後,返回x+1.
		}
				}
class Program {
	public static void Main(string[] args)
		{
		Func f = new Func(F.Inrement);
		int x;
		x = 10;
		//函式代表開始激發,即新開子執行緒,在其中執行函式代表的代表的函式.
		//激發過程返回一個非同步結果物件,裡面存的有函式執行狀態等
		IAsyncResult result = f.BeginInvoke(x,null,null);
		//函式代表激發後,主執行緒繼續往下執行,
		//目前狀態,主、子執行緒同時執行
		while(x>0)
			{
			Console.WriteLine("the number is {0}",x--);
			Thread.Sleep(1000);//在主執行緒中,x有多大,就暫停多少秒.分步停.
			}
		int y = f.EndInvoke(result);//終止激發,非同步結果物件作為引數.
								   //查詢結果物件裡的域,看能否成功結束激發
								  //若能,則函式的結果被返回
		Console.WriteLine(y);
	
		Console.Write("Press any key to continue . . . ");
		Console.ReadKey(true);
		}
			  }
}
從螢幕上的列印結果來看,雖然主、子執行緒都分別停頓十秒,但是它們的耗時並沒有累加成20秒,而是主執行緒耗時10秒執行完畢後,子執行緒的結果馬上出來列印了。

這就是多執行緒的魅力吧。


相關推薦

c#學習筆記 目前執行執行函式思路

1.如果不用傳遞引數和返回結果,僅僅是執行程式碼體,則直接在新建執行緒的時候傳遞函式的名稱。 Thread th = new Thread(FunctionName); 完整程式碼如下所示,新建子執行緒開始後,主執行緒立即返回,主執行緒與子執行緒同時執行,在螢幕上列印內容。

C#學習筆記):抽象方法、抽象類、態和接口

具體實現 烏龜 ima 索引器 over protect ret 需要 技術 using System; using System.Collections.Generic; using System.Linq; using System.Text;

設計模式C++學習筆記一(c/c++面試筆試題)

一、指標與引用有什麼區別? 1、指標會佔用記憶體,引用不佔用記憶體。 2、引用在定義時必須初始化。 3、沒有空的引用,但是有空的指標。 二、static關鍵的幾個作用 1、函式體內的static變數的作用範圍為該函式體,該變數記憶體只分配一次,因此其值在下次再呼叫該函式時

Linux netfilter 學習筆記 netfilter模組新增一個match

通過這段時間的學習,基本上熟悉了netfilter模組,為了進一步加深對netfilter的認識以及理解iptables與netfilter的聯絡,準備新增一個match模組。 在看到閘道器產品會有一個公網限制的功能,就想著新增一個公網數目限制的功能。 該模組實現的功能

C++學習筆記):vector物件在記憶體空間中是如何增長的

vector物件在記憶體空間中是如何增長的 我們都知道vector物件是動態儲存的,從這一點看有點像連結串列,可以動態的增加或減少元素。我們也知道連結串列中是有指標變數,專門用於儲存上一個和下一個元

python學習筆記集合

head erro sdi pytho not in 註意 inter ren mod 集合:對應數學中的集合類型。集合中的元素是唯一,且無序的。 創建集合   方法一:使用{},註意python會自動刪除重復元素 >>> number = {1,2,3

c++學習筆記檔案操作

每天進步一點點,努力奮鬥的小菜鳥。 曾經搞了好多次的C語言多檔案操作,都沒搞成功,昨天晚上終於搞成功了,雖然是簡單到爆的操作,但我還是挺高興的,哈哈哈。貼出來一方面怕自己忘,一方面若有初學者看到希望能對他們有點小小的幫助。現代數字訊號處理快要考試了,現在慌得一批,估計兩週以內會減少程式設計的時間

Effective C++筆記:inline函式的裡裡外外

1.inline函式簡介 inline函式是由inline關鍵字來定義,引入inline函式的主要原因是用它替代C中複雜易錯不易維護的巨集函式。 2.編譯器對inline函式的處理辦法 inline對於編譯器而言,在編譯階段完成對inline函式的處理。將呼叫動作替換為函式的本體。但是它只是一種

執行學習筆記四——CountDownLatch、 CyclicBarrie、Semaphore的使用

CountDownLatch CountDownLatch的構造器: public CountDownLatch(int count) { if (count < 0) throw new IllegalArgumentExceptio

Android開發學習筆記)基礎UI控制元件ListView

一、ListView常用XML屬性: android:choiceMode="" 設定ListView的選擇行為 android:divider="" 設定List列表項的分隔條(即可用顏

opencv學習筆記:人臉識別演算法EigenFace

簡要: 特徵臉演算法是將影象每一個畫素當作一維特徵,然後用SVM或其它機器學習演算法進行訓練。但這樣維數太多,根本無法計算。我這裡用的是ORL人臉資料庫,英國劍橋實驗室拍攝的,有40位志願者的人臉,在不同表情不同光照下每位志願者拍攝10張,共有400張圖片,大小為112*9

c++ primer第版----學習筆記)Ⅰ

oop的核心思想是多型性。我們把具有繼承關係的多個型別稱為多型型別; 引用或指標的靜態型別與動態型別不同這一事實正是c++語言支援多型性的根本存在 當且僅當對通過指標或引用呼叫虛擬函式時,才會在執行時解析該呼叫,也只有在這種情況下物件的動態型別才有可能與靜態型別不同 一個派生類的函式如果覆蓋了某個繼承而來

C++學習筆記 複合型別結構體(struct)

結構宣告的位置很重要。可以有兩種宣告位置:一種是可以將宣告放在main()函式中,緊跟在開始括號的後面。另一種是將宣告放在main()函式的前面,這裡採用的就是這種方式,位於函式外面的宣告稱為外部宣告。對於只有一個主函式的程式來說放在外面和裡面沒有區別,但是如果有多個函式,外部宣告可以被其後面的任何函式使用,

[C#學習筆記執行2]執行同步與併發訪問共享資源工具—Lock、Monitor、Mutex、Semaphore

“執行緒同步”的含義         當一個程序啟動了多個執行緒時,如果需要控制這些執行緒的推進順序(比如A執行緒必須等待B和C執行緒執行完畢之後才能繼續執行),則稱這些執行緒需要進行“執行緒同步(thread synchronization)”。         執行緒

C#回顧學習筆記:程式設計師必備技能,除錯

編寫程式碼免不了會出現各種錯誤,在執行時會發現不是拋異常就是執行結果跟預期結果有差異。這時候就需要思考如何去解決這個問題。 首先應該清楚一點:程式碼都是從頭開始,一句一句往下執行。程式設計師在發現程式碼有問題時,首先要想到的就是,這個錯誤可能發生在第幾句程式碼。有經驗的程式

OpenCV2學習筆記):利用Cmake高速查找OpenCV函數源代碼

one 生成 img log 分享 lan 學習筆記 全部 modules 在使用OpenCV時,在對一個函數的調用不是非常了解的情況下,通常希望查到該函數的官方聲明。而假設想進一步研究OpenCV的函數,則必須深入到源碼。在VS中我們能夠選中想要查

c#學習筆記Application.DoEvents應用

box nbsp net replace 運算 技術 oop blank 假死 Visual Studio裏的摘要:處理當前在消息隊列中的所有 Windows 消息。 交出CPU控制權,讓系統可以處理隊列中的所有Windows消息 比如在大運算量循環內,加Applicati

[C#學習筆記異步編程模式2]BeginInvoke和EndInvoke方法 (轉載)

cti otf 函數返回 編程模式 catch 數值 gin 單線程 blog 為什麽要進行異步回調?眾所周知,普通方法運行,是單線程的,如果中途有大型操作(如:讀取大文件,大批量操作數據庫,網絡傳輸等),都會導致方法阻塞,表現在界面上就是,程序卡或者死掉,界面元素不動了,

MySQ學習筆記 NULL值處理

con pop -a 能夠 第一個 ips ng- 索引 one 這是MySQL一大特殊之處。 概念上。NULL意味著“沒有值”或“未知值”,且它被看作有點與眾不同的值。為了測試NULL。你不能使用算術比較

C++學習筆記泛型算法

vector ace sort clu 算法 clas uniq bits 有時 先貼個代碼 有時間的再補筆記 1 #include<bits/stdc++.h> 2 using namespace std; 3 4 //模板類在接收