向執行緒池中放入非同步操作

2022-04-12 10:27:08 字數 1492 閱讀 7623

static

void main(string

args)

", state);

console.writeline(

"worker thread id:

", thread.currentthread.managedthreadid);

thread.sleep(timespan.fromseconds(

2));

}, "lambda state1");

//使用閉包機制,從而無須傳遞lambda表示式的狀態,閉包更加靈活,允許我們向非同步操作傳遞乙個以上的物件而且這些物件具有靜態型別

threadpool.queueuserworkitem( _ =>,

", x + y, lambdastate);//

lambdastate

console.writeline("

worker thread id:

", thread.currentthread.managedthreadid);

thread.sleep(timespan.fromseconds(

2));

}, "lambda state2");

thread.sleep(timespan.fromseconds(

2));

console.read();

}private

static

void asyncoperation(object

state)

", state ?? "

(null)");

console.writeline(

"worker thread id:

", thread.currentthread.managedthreadid);

thread.sleep(timespan.fromseconds(

2));

}

工作原理:

首先定義了asyncoperation方法,其接受單個object型別的引數。然後使用queueuserworkitem方法將該方法放到執行緒池中。接著再次放入該方法,但是這次給方法呼叫傳入了乙個狀態物件。該物件將作為狀態引數傳遞給asynchronousoperation方法。

在操作完成後讓執行緒睡眠一秒鐘,從而讓執行緒池擁有為新操作重用執行緒的可能性。如果注釋掉所有的thread.sleep呼叫,那麼所有列印出的執行緒id多半是不一樣的。如果id是一樣的,那很可能是前兩個執行緒被重用來執行接下來的兩個操作。

首先將乙個lambda表示式放置到執行緒池中。這裡沒什麼特別的。我們使用了lambda表示式語法,從而無須定義乙個獨特的方法。

然後,我們使用閉包機制,從而無須傳遞lambda表示式的狀態。閉包更靈活,允許我們向非同步操作傳遞乙個以上的物件而且這些物件具有靜態型別。所以以前介紹的傳遞物件給方法**的機制既冗餘又過時。在c#中有了閉包後就不在需要使用它了。

(閉包的概念和注意事項:

非同步執行緒池中加入MDC引數

在專案中需要非同步執行任務方法,但是非同步執行時會使用另乙個執行緒。因為mdc的引數時基於threadlocal的,每個執行緒都保留乙份。這樣就造成非同步執行緒的日誌id沒有或者跟前乙個日誌id不一致,不便於查詢日誌。解決方法 自定義任務裝飾器,並配置到執行緒池 bean taskexecutor ...

springBoot非同步執行緒操作

springboot專案中我們常常會有比較耗時的操作,而前端不關心你的處理結果時。比如給使用者傳送郵件,此時,我們就可以在使用者操作時使用非同步來完成傳送郵件,不需要等郵件傳送完成後再給到前端相應。下面詳細介紹一下具體步驟 configuration enableasync public class...

android執行緒及非同步操作

現在完成乙個計數任務,從1計到100,在textview中顯示進度。如果把這些迴圈加的操作放在oncreat 方法中,肯定會出現阻塞。利用asynctask類在後台進行操作,可以使主ui執行緒順暢進行下去。這個類裡主要涉及到3個方法,doinbackground onprogressupdate o...