1.前提條件
Contract.Requires(bool)
.EndContractBlock();用于兼容舊if判斷代碼
2.后置條件
.Ensures(bool)
.Result<type>() 返回值
.OldValue<type>(x)返回參數的原始值
.ValueAtResult(out x)返回out參數的值
3.集合檢查
.Exists()任一項滿足條件
.ForAll()所有項滿足條件
4.恒等式條件
.Invariant(bool)
5.接口綁定協定
[ContractClass(typeof(協定實現類))] 接口特性
[ContractClassFor(typeof(接口))] 協定實現類特性
[pure] 常態操作特性
Task t1=new Task(Action<object>);創建新任務
Task t3=new Task(Func<object, result>, data);創建可返回結果的任務
//TaskCreationOptions 指定任務類型
t1.Start();開始運行
Task t2 = t1.ContinueWith(Action<Task>);后繼任務,參數為上個任務
//TaskCreationOptions 指定啟動時機
t3.Start()
t3.Wait()等待任務完成
t3.Result 提取結果
Parallel.For(0,9,Action<int>); 從0~9重復執行同一個方法
Parallel.For(0,9,Action<int,ParallelLoopState>); ParallelLoopState控制迭代流程
Parallel.For(0,9,Func<init>,Func<int, ParallelLoopState, init, init2>,Action<init2>); Func<init>初始化任務,第二個Func是每次迭代執行的函數,任務返回值交由Action處理。(任務數可能少于迭代次數,也就是系統會重用某一任務,而開始和結尾只有創建任務和結束任務才會調用,函數之間傳遞的信息需要特別留意)
Parallel.ForEach(source<t>, Action<t>) 同步迭代數據源
Parallel.ForEach(source<t>,Action<t,ParallelLoopState, int>) 帶迭代次數和控制參數的版本
CancellationToken 控制參數
CancellationTokenSource cts=new CancellationTokenSource(); //創建控制參數
cts.Token.Register(Action); //注冊取消后執行的方法
cts.Cancel(bool);//取消任務
cts.Token //即CancellationToken
取消任務會產生OperationCanceledException異常。
cts.Token.IsCancellationRequested 是否取消任務
cts.Token.ThrowIfCancellationRequested(); 取消狀態下拋出異常
lock(obj) 鎖定對象, 或者在該對象內部進行鎖定處理可將該對象定義為線程安全對象。
多個鎖定對象鎖定順序不一致,可能導致死鎖。(個人看法:要么保持鎖定順序一致,要么不要鎖定多個關聯對象,方法一,改造成線程安全對象,并且每個對象不在解鎖前訪問另一個線程安全對象;方法二,用單一的鎖定對象包裹關聯對象,讓它們成為一個整體(因為保持順序一致較難,或可按字典排序))。
lock(this) 危險語句,因為對象可能在對象外部被鎖定。應該用對象的私有成員做鎖定標志。
當讀取和寫入應該連續(比如避免將舊值存會已經改變了的變量中),這種有事務性要求的操作中,應該鎖住整一個過程,而不是分別鎖住讀寫兩部分(一個事務一個鎖的原則設計方法,比如提供 read() 和 readAndWrite()界面,而不是read 和 write界面)。
SpinLock 是結構版本的Monitor,性能更優。
System.Threading.Timer(Action<object>, obj, TimeSpan, TimeSpan) 按指定間隔調用方法
Thread.Sleep(int); 休眠指定毫秒
class MyDependencyObject: DependencyObject //特定基類
{ public int Value{get{return (int)GetValue(ValuePRoperty);} //基類成員GetValue
set{SetValue(ValueProperty,value);}} //調用基類成員SetValue
public static readonly DependecyProperty ValueProperty =
DependecyProperty.Register(“Value”,typeof(int),typeof(MyDependencyObject), //注冊依賴屬性
new PropertyMetadata(初值, 值變更后回調方法, 值變更前回調方法));}
UIElement 支持冒泡和隧道事件的基類
DependecyProperty.RegisterAttached() 附加屬性注冊
“{StaticResource ID}”
等價于
<StaticResourceExtension ResourceKey=”ID” />
MarkupExtension 標記擴展的基類
[MarkupExtensionReturnType(typeof(string))] 標記擴展返回類型特性
public override object ProvideValue(IServiceProvider serviceProvider) 重載的返回函數
serviceProvider.GetService(typeof(iprovideValueTarget)) as IProvideValueTarget; 調用的查詢服務
新聞熱點
疑難解答