2019 9 2 C 同步方法轉非同步

2022-01-13 16:02:09 字數 3190 閱讀 6052

title

author

date

createtime

categories

c#同步方法轉非同步

lindexi

2019-09-02 12:57:37 +0800

2018-2-13 17:23:3 +0800

c#最簡單的方法是建立乙個新的執行緒,建立的方法是使用 task.run ,請看下面**,原來有乙個函式 delay 需要把他轉換為非同步,就可以使用 delayasync 裡面用乙個執行緒

public

async

task

delayasync()

private

void

delay()

在很古老的開發,微軟告訴大家使用 amp 非同步程式設計模型 asynchronous programming model,這個模型就是使用 begin xx 和 end xx 的方法 如 filestream.beginread 和stream.endread 表示

現在微軟告訴大家,建議使用 eap 基於事件的非同步模式,也就是 async 的模型

例如有乙個檔案讀取,檔案讀取可以使用 beginread 和 endread ,看到下面**大家就會覺得這很難用

var

filestream

=new

filestream("e:\\lindexi\\部落格"

,filemode.open);

varbuffer

=new

byte[65535];

iasyncresult

asyncresult

=null;

filestream.beginread(buffer, 0, buffer.length, ar

=> , null);

filestream.endread(asyncresult);

好在微軟提供乙個方式把上面的**轉換為 async ,方法是 task.factory.fromasync 請看**

await

task.factory.fromasync(filestream.beginread, filestream.endread, buffer, 0, buffer.length, null);

如果希望對於如動畫的等待,那麼建議看如何實現乙個可以用 await 非同步等待的 awaiter - walterlv

從如何實現乙個可以用 await 非同步等待的 awaiter - walterlv複製出來類 dispatcherasyncoperation

動畫的等待是在動畫結束返回函式,也許這裡比較難說,動畫有開始和結束事件,希望在結束事件函式才返回

private

void

trirleljallardra()

///>

/// 執行動畫

///summary

>

private

void

teedraiseteretal()

;}

因為 trirleljallardra 拿不到 storyboard.completed 所以如果要在動畫完成之後寫呼叫**是很難的。

為什麼需要在其他函式寫?如果是繼續執行動畫,而且需要在上乙個動畫執行完成,寫在 completed 的**會很多。如果可以使用下面的函式的方法,可讀性比較好

private

void

trirleljallardra()

///>

/// 執行動畫1

///summary

>

private

void

animation1();}

///>

/// 執行動畫2

///summary

>

private

void

animation2();}

///>

/// 執行動畫3

///summary

>

private

void

animation3()

;}

如果需要寫在**裡,那麼可讀性比較差

private

void

trirleljallardra()

///>

/// 執行動畫1

///summary

>

private

void

animation1();}

///>

/// 執行動畫2

///summary

>

private

void

animation2();}

///>

/// 執行動畫3

///summary

>

private

void

animation3()

;}

那麼這時使用 dispatcherasyncoperation 就可以做非同步,讓**可讀性比上面好

private

async

void

trirleljallardraasync()

///>

/// 執行動畫1

///summary

>

private

dispatcherasyncoperation

animation1()

;return

dispatcherasyncoperation;

}///

>

/// 執行動畫2

///summary

>

private

dispatcherasyncoperation

animation2()

;return

dispatcherasyncoperation;

}///

>

/// 執行動畫3

///summary

>

private

dispatcherasyncoperation

animation3()

;return

dispatcherasyncoperation;

}

2019 9 2 C 判斷檔案是否被混淆

title author date createtime categories c 判斷檔案是否被混淆 lindexi 2019 09 02 12 57 37 0800 2018 2 13 17 23 3 0800 c 可以使用混淆工具對乙個dll 和 exe 進行混淆。但是如何知道乙個檔案是否已經...

2019 9 2 C 列舉中使用Flags特性

title author date createtime categories c 列舉中使用flags特性 lindexi 2019 09 02 12 57 37 0800 2018 2 13 17 23 3 0800 c 如果對乙個值可以包含多個,那麼可以使用列舉,加上flags 在寫前,需要知...

2019 9 2 C 列舉中使用Flags特性

title author date createtime categories c 列舉中使用flags特性 lindexi 2019 09 02 12 57 37 0800 2018 2 13 17 23 3 0800 c 如果對乙個值可以包含多個,那麼可以使用列舉,加上flags 在寫前,需要知...