6搞懂執行緒池(二)

2022-03-05 07:04:15 字數 3522 閱讀 8311

取消非同步操作

等待事件處理器及超時

計時器backgroundworker

零、取消非同步操作

這一小節將引入兩個類 cancellationtokensource 和 cancellationtoken 。這兩個類是在 .net 4.0 中被引入的,因此如果需要使用這兩個類我們必須在 .net 4.0 及其以上版本中使用,目前是取消非同步操作的標準。下面我們通過廚師做飯,中途撤銷訂單的例子來看一下這兩個類具體該怎麼用。

using system.threading;

using

static system.console;

using

static system.threading.thread;

namespace nosix

read()

;}static

void

cookie

(cancellationtoken token)

sleep

(2000);

}writeline

("我做完飯了");

}}}

在上面的**中我們在 cookie 方法中通過輪詢的方式來檢查cancellationtoken.iscancellationrequested屬性。如果該屬性為true,則說明操作需要被取消,我們必須放棄該操作。下面我們將 cookie 方法修改一下,用另一種方式來實現取消操作

static

void

cookie

(cancellationtoken token)

writeline

("我做完飯了");

}catch

(operationcanceledexception)

}

static

void

cookie

(cancellationtoken token)

sleep

(2000);

}writeline

("我做完飯了");

}

第三種方式是註冊乙個**函式。操作被取消時執行緒池將呼叫該**函式。.net 可以鏈式的傳遞乙個取消邏輯到另乙個非同步操作中。

一、等待事件處理器及超時

using system;

using system.threading;

using

static system.console;

using

static system.threading.thread;

namespace registerwaitforsingleobject

static

void

cookie

(timespan timespan)

}private

static

void

workoperation

(cancellationtoken token,

manualresetevent evt)

sleep

(1000);

} evt.

set();

}private

static

void

cookiewait

(cancellationtokensource cts,

bool istimeout)

else}}

}

我們註冊了處理超時的非同步操作。當接收到了 manualrestevent 物件的訊號,工作者操作成功完成後會發出訊號。如果操作完成之前超時,那麼會使用 cancellationtoken 來取消第乙個操作。我們向執行緒池中放入乙個耗時長的操作。它會執行 6 秒鐘,如果成功完成則會設定乙個 manualresetevent 訊號類。在其他情況下,比如需要取消該操作,那麼該操作會被丟棄。最後,為操作提供5秒的超時時間是不夠的。這是因為操作會花費 6 秒來完成,只能取消該操作。所以如果提供 7 秒的超時時間是可行的,該操作會順利完成。在有大量執行緒處於阻塞狀態等待執行緒事件訊號時這種方式非常有用。

二、計時器

我們前面所講的都是一次性呼叫,那麼如何進行週期性呼叫呢?這時我們就用到了計時器功能,下面我們通過例子來看一下。

using system;

using system.threading;

using

static system.console;

using

static system.threading.thread;

namespace _timer_

finally

}static

timer timer;

static

void

timeropration

(datetime datetime)

");}

}}

三、backgroundworker

在這一小節我們將不使用執行緒池和委託而是使用了事件。事件表示了一些通知的源或當通知到達時會有所響應的一系列訂閱者。下面我們先來看一下例子。

using system;

using system.componentmodel;

using

static system.console;

using

static system.threading.thread;

namespace background_worker

}while

(bw.isbusy);}

static

void

dowork

(object sender,

doworkeventargs e)")

;backgroundworker bw =

(backgroundworker)sender;

for(

int i =

1; i <=

100; i++)if

(i %

10==0)

sleep

(100);

} e.result =42;

}static

void

progresschanged

(object sender,

progresschangedeventargs e)

已完成 。progress 執行緒池執行緒id: ");

}static

void

completedchanged

(object sender,

runworkercompletedeventargs e)")

;if(e.error !=

null) "

);}else

if(e.cancelled)

else")

;}}}

}

使用執行緒池 6

using system using system.threading namespace 使用計時器 private static timer timer private static void timeroperation datetime start second from timer thr...

執行緒池實現原理(二)

forkjoinpool int parallelism,forkjoinworkerthreadfactory factory,uncaughtexceptionhandler handler,boolean asyncmode 接下來,我們來看一下newworkstealingpool的初始化引...

6 Dubbo執行緒模型與執行緒池策略

當我們聊dubbo執行緒模型 執行緒池策略的時候,我們應該考慮哪些問題?根據請求的訊息類被io執行緒處理還是被業務執行緒池處理,dubbo提供了下面幾種執行緒模型 alldispatcher原始碼剖析 all執行緒模型的實現如下 default thread pool configure publi...