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(非同步結果物件)作為轉接的介面。
完整程式碼如下
從螢幕上的列印結果來看,雖然主、子執行緒都分別停頓十秒,但是它們的耗時並沒有累加成20秒,而是主執行緒耗時10秒執行完畢後,子執行緒的結果馬上出來列印了。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); } } }
這就是多執行緒的魅力吧。
相關推薦
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 //模板類在接收