如果預計操作的等待的時間非常短,可以考慮使用輕量級的手動重置事件,manualreseteventslim。它可以發出訊號和等待事件。從名稱和使用方式上看,它主要是提供以人為本的操作方式,在基於人對程式執行過程非常了解的情況下,由人控制整個同步的過程。
manualreseteventslim 提供了3個常用的方法和3個唯讀的屬性。
建構函式:
方法:屬性:
程式示例:在這個例子中使用了manualreseteventslim,它使得task1,2,3變成了順序執行。
using system;
using system.text;
using system.threading;
using system.threading.tasks;
namespace sample5_7_manualreseteventslim
task : # value: *****\n",
datetime.now.timeofday, taskid, i);
i++;
tryfinally}}
private
static
void
work2(int taskid)
task : # value: *****\n",
datetime.now.timeofday, taskid, i);
i++;
tryfinally}}
private
static
void
work3(int taskid)
task : # value: ~~~~~\n",
datetime.now.timeofday, taskid, i);
i++;
tryfinally}}
static
void main(string args)
, 0);
_tasks[1] = task.factory.startnew((num) =>
, 1);
_tasks[2] = task.factory.startnew((num) =>
, 2);
var finaltask = task.factory.continuewhenall(_tasks, (tasks) =>
);try
catch (aggregateexception aex)
finally
console.readline();}}
}
超時機制對於任務的同步是非常必要的,這裡也提供了使用者設定超時的方法。
manualreseteventsilm.wait(int time_out);
程式示例:在這個例子中任務1會等待5秒後在設定event,但任務2,3的超時時間為2秒。
using system;
using system.text;
using system.threading;
using system.threading.tasks;
namespace sample5_7_manualreseteventslim
task : # value: *****\n",
datetime.now.timeofday, taskid, i);
i++;
tryfinally}}
private
static
void
work2(int taskid)
while ((i < run_loop) && (m_worker2event.isset))
task : # value: *****\n",
datetime.now.timeofday, taskid, i);
i++;
tryfinally}}
private
static
void
work3(int taskid)
while ((i < run_loop) && (m_worker3event.isset))
task : # value: ~~~~~\n",
datetime.now.timeofday, taskid, i);
i++;
tryfinally}}
static
void main(string args)
, 0);
_tasks[1] = task.factory.startnew((num) =>
, 1);
_tasks[2] = task.factory.startnew((num) =>
, 2);
var finaltask = task.factory.continuewhenall(_tasks, (tasks) =>
);try
catch (aggregateexception aex)
finally
console.readline();}}
}
可以注意到其實task 1只是阻塞了task2,但task3也受到了超時的影響。超時機制在系統中的傳播會對整個程式造成一定的影響。
好的方面:幫助系統所有模組了解到系統中出現了某些異常,要採取措施了。
壞的方面:有些模組對於其他模組的超時並沒有相應的準備,直接導致一連串的異常的反應,系統崩潰。
如果需要實現跨程序的同步,這時可以使用manualresetevent。manualresetevent和manualreseteventslim有一定的區別,比如它沒有isset屬性。
方法:
manualresetevent的使用方式和manualreseteventslim還是基本一致的。
C 並行程式設計 之 互斥鎖的使用
在並行程式設計中,訪問臨界區是經常會遇到的問題,加鎖,釋放鎖是經常會使用到的解決方式。例如 lock oneobject lock會呼叫system.threading.monitor.enter方法,然後通過 system.threading.monitor.exit來進行釋放。上面的 等同與 b...
C 程式設計之委託與事件 二
二 事件 1.了解概念 事件就是當物件或類狀態發生改變時,物件或類發出的資訊或通知。發出資訊的物件或類稱為 事件源 對事件進行處理的方法稱為 接收者 通常事件源在發出狀態改變資訊時,它並不知道由哪個事件接收者來處理.這就需要一種管理機制來協調事件源和接收者,c 中通過函式指標來完成的.在c 中事件使...
c 程式設計之委託 事件與執行緒
委託是乙個類,它定義了方法的型別,使得可以將方法當作另乙個方法的引數來進行傳遞,這種將方法動態地賦給引數的做法,可以避免在程式中大量使用if else switch 語句,同時使得程式具有更好的可擴充套件性。在c 中使用delegate關鍵字定義委託,然後使用我們熟悉的函式呼叫的語法來呼叫委託。pu...