1. 程式人生 > >C# 多引數執行緒以及匿名函式

C# 多引數執行緒以及匿名函式

今天早上的時候,要寫一個多引數的執行緒,找到一種,用新建一個物件的方法來引數,其實傳入的也是單個引數,只不過傳入的是一個物件,只不過物件裡有很多屬性罷了。後來在stackoverflow上看到這麼個答案,覺得很贊。所以寫下來,以備不時之需。

public Thread StartTheThread(SomeType param1, SomeOtherType param2) {
  var t = new Thread(() => RealStart(param1, param2));
  t.Start();
  return t;
}

private static void RealStart(SomeType param1, SomeOtherType param2) {
  ...
}

其用了一個匿名函式。

要理解上面的程式碼,首先看要看Thread()這個類的解構函式:

   
        public Thread(ParameterizedThreadStart start); 
        public Thread(ThreadStart start);      
        public Thread(ParameterizedThreadStart start, int maxStackSize);   
        public Thread(ThreadStart start, int maxStackSize);
你會發覺ThreadStart和ParmeterizeThreadStart 兩個都是delegate,也就是委託函式。對於委託函式從.net3.0開始,有個很好的替代就是匿名函式。在MSDN的官方網站中找到了
委託函式的發展過程
,最後轉換為匿名函式,不可謂不精彩,更加簡單實用。
 TestDelegate testDelA = new TestDelegate(M);

// C# 2.0: A delegate can be initialized with
// inline code, called an "anonymous method." This
// method takes a string as an input parameter.
TestDelegate testDelB = delegate(string s) { Console.WriteLine(s); };

// C# 3.0. A delegate can be initialized with
// a lambda expression. The lambda also takes a string
// as an input parameter (x). The type of x is inferred by the compiler.
TestDelegate testDelC = (x) => { Console.WriteLine(x); };

// Invoke the delegates.
testDelA("Hello. My name is M and I write lines.");
testDelB("That's nothing. I'm anonymous and ");
testDelC("I'm a famous author.");

A老老實實的教科書,就相當於開頭所說的那樣,新建一個物件,物件屬性傳引數;B跟A同理,但是B可以傳多個引數了,差不多就是C的雛形了;C的話更加簡潔,直接一個Lambda表示式匿名函式就委託了。

       寫到這,大致就明白了,其實就是用了一個匿名函式()=>RealStart(param1 ,param2)替代了delegate ParameterizedThreadStart(object obj)


相關推薦

C# 引數執行以及匿名函式

今天早上的時候,要寫一個多引數的執行緒,找到一種,用新建一個物件的方法來引數,其實傳入的也是單個引數,只不過傳入的是一個物件,只不過物件裡有很多屬性罷了。後來在stackoverflow上看到這麼個答案,覺得很贊。所以寫下來,以備不時之需。 public Thread

c++中執行使用同一個函式

我是小白,最近在學習實現一個簡單的執行緒池,執行緒池中維護了一個存放執行緒的陣列以及一個任務佇列。在建立執行緒池(建構函式中)時建立若干個執行緒,起始時由於任務佇列中沒有任務,建立的每一個執行緒都處於阻塞狀態。使用pthread_create函式建立執行緒時把所有的執行緒與

c++型的原理 以及虛擬函式表詳解

c++中多型的原理 要實現多型,必然在背後有自己的實現機制,如果不瞭解其背後的機制,就很難對其有更深的理解。 一個多型的例子 class Person{ public: virtual void Drink() { cout << "drink water" &

基於C++11的執行池(threadpool),簡潔且可以帶任意引數(轉)

咳咳。C++11 加入了執行緒庫,從此告別了標準庫不支援併發的歷史。然而 c++ 對於多執行緒的支援還是比較低階,稍微高階一點的用法都需要自己去實現,譬如執行緒池、訊號量等。執行緒池(thread pool)這個東西,在面試上多次被問到,一般的回答都是:“管理一個任務佇列,一個執行緒佇列,然後每次取一個任務分

c++11中執行中Join函式

寫在前面 Join函式作用: Join thread The function returns when the thread execution has completed.//直到執行緒完成函式才返回 This synchronizes the moment t

c#執行以及Dispatcher.Invoke

主執行緒 private void Stabilitybutton_Click(object sender, RoutedEventArgs e) { for (int Nr = 0; Nr

C#非同步和執行以及Thread、ThreadPool、Task區別和使用方法

本文的目的是為了讓大家瞭解什麼是非同步?什麼是多執行緒?如何實現多執行緒?對於當前C#當中三種實現多執行緒的方法如何實現和使用?什麼情景下選用哪一技術更好? 第一部分主要介紹在C#中非同步(async/await)和多執行緒的區別,以及async/await使用方法。 第二部分主要介紹在C#多執行緒當中Thr

C# 解決子執行不能操作主執行UI(介面)問題,涉及到執行的概念。

1、在預設情況下,C#不准許在一個執行緒中直接訪問或操作另一執行緒中建立的控制元件,這是因為訪問windows窗體控制元件本質上是不安全的。 2、執行緒之間是可以同時執行的,那麼如果有兩個或多個執行緒同時操作某一控制元件的某狀態,嘗試將一個控制元件變為自己需要的狀態時, 執行緒的死鎖就可能發生。

執行匿名內部類的理解

多執行緒 一.多執行緒 好處:提高任務的執行效率 (執行緒本身也會耗費系統資源 建立執行緒要把握度) 程序:一個正在執行的程式 一個程序可以有一個或多個執行緒 分時排程:cpu同

究極難題 :一個執行10秒以上至無窮的呼叫函式,成功後有返回值。在執行中怎麼實現呼叫不卡住該執行

究極難題 :一個執行10秒以上至無窮的呼叫函式,成功後有返回值。在多工執行緒中怎麼實現呼叫不卡住該執行緒? Note:一旦呼叫函式,中途無法取消。 思路一:讓其執行在獨立執行緒內。加超時時間。 1. 在超時時間內函式有返回值,則函式執行結束。則獨立執行緒結束。 2. 在超時時

c/c++ 執行 執行等待同一個執行的一次性事件

多執行緒 多個執行緒等待一個執行緒的一次性事件 背景:從多個執行緒訪問同一個std::future,也就是多個執行緒都在等待同一個執行緒的結果,這時怎麼處理。 辦法:由於std::future只能被呼叫一次get方法,也就是隻能被某一個執行緒等待(同步)一次,不支援被多個執行緒等待。所以std::shar

執行Runnable匿名內部類一定要注意大坑

通常情況下,當需要模擬多執行緒的時候我們會選擇兩種方式。第一種就是自己實現Runnable類,然後在主類中呼叫我們自己實現的Runnable,例如: package concurrent; public class MyRunnable implements Runnab

C/C++執行的基本函式

最近在CSDN上閒逛,不知道看些什麼,刷著刷著就看到了建議性鎖和強制性鎖,看了簡單的概念後又刷到了重入鎖和自旋鎖。發現自己對執行緒裡的鎖瞭解的還不夠深(以前只知道互斥鎖、條件鎖和讀寫鎖),所以現在想先整理下與執行緒相關的函式,然後再學習重入鎖和自旋鎖。 建立執行緒和結束執行

C# 控制元件執行匿名委託定義

當你在子執行緒中要修改主執行緒某個控制元件的值時,有不想再去定義一個執行緒變數時,就可以直接使用執行緒匿名委託來實現。 主要是方便快捷 控制元件.BeginInvoke(new ThreadStart(delegate ()       

C++ TIMER與執行的關係,以及WM_TIMER訊息的不準確性

一,SetTimer介紹 SetTimer函式定義如下: UINT_PTR SetTimer( HWND hWnd, // 視窗控制代碼 UINT_PTR nIDEvent, // 定時器ID,多個定時器時,可以通過該ID判斷是哪個定時器 UINT nElap

C# 連線mysql,連線後顯示執行

資料庫連線字串 return string.Concat(new string[]             {      &n

執行以及執行

標題格   1、執行緒的五種狀態1、執行緒的五種狀態  1)、新建  當new建立一個執行緒,例如new thread(r),執行緒還沒開始執行,處於新建狀態。  2)、就緒  新建的新執行緒並不會自動執行,要執行需要呼叫start()方法建立執行緒執行的系統資源,返回後,此時執行緒就處於就緒狀態。  但是

Python執行中join函式與setDaemon函式使用說明

      在Python多執行緒程式設計的時候,經常需要用到join函式和setDaemon函式。之前對這兩個函式一直理解不是很到位。今天查閱了很多資料,對兩個函式的認識更加的深入一些了。       join([timeout])可以參考Python文件說明。大概意思就

單例模式--餓漢(按需建立)、懶漢(執行以及執行下改進)

程式碼註釋有介紹,(排版過於難受,下次用md排完再傳上來) package singleton; /** * @author: ycz * @date: 2018/12/24 0024 22:15 * @description: 懶漢模式 */ public class SingleTon1

java 執行匿名內部類實現執行

package 匿名內部類實現多執行緒; public class Demo { public static void main(String[] args) { // 繼承Thread類實現多執行緒 new Thread() {