C 中的非同步陷阱

2021-09-16 18:14:11 字數 1069 閱讀 3043

有時候,理解一種語言中的缺陷的最好方式是檢視另一種語言如何防止這些缺陷發生。《real-world functional programming》(注:該書已由清華大學出版社引進,中文名《c#與f#程式設計實踐》)的作者tomas petricek討論了非同步c#**中常見的7項錯誤,並說明f#如何降低這些缺陷出現的可能性。

\u0026#xd;\n

async沒有非同步執行:只有在第乙個await語句之後出現的**才會非同步執行。

\u0026#xd;\n

忽略結果:忘記await乙個函式返回的任務,將會導致亂序執行。

\u0026#xd;\n

async voidasync void lambda函式:發生在當某個函式接收乙個action委託而不是func\u0026lt;…,task\u0026gt;委託的時候。此外也無法await乙個async函式。

\u0026#xd;\n

巢狀任務:在語句「await task.factory.startnew(async () =\u0026gt; );」中,第乙個和第二個await語句互相之間完全無關。這意味著第乙個await將在第二個await之前完成,而語句中關聯的1000ms延遲將被忽略。

\u0026#xd;\n

未按非同步方式執行:使用task.wait()會將整個呼叫棧強制轉為同步模式。

\u0026#xd;\n

對那些不熟悉f#的開發者來說,在了解到f#中的async工作流並不是基於task和task\u0026lt;t\u0026gt;型別的時候或許會感到驚訝。相反,f#使用自己的型別——async\u0026lt;t\u0026gt;。

\u0026#xd;\n

檢視英文原文:asynchronous gotchas in c#

\u0026#xd;\n

感謝姚琪琳對本文的審校。

\u0026#xd;\n

C 中的非同步陷阱

c 中的非同步陷阱 原文 有時候,理解一種語言中的缺陷的最好方式是檢視另一種語言如何防止這些缺陷發生。real world functional programming 注 該書已由清華大學出版社引進,中文名 c 與f 程式設計實踐 的作者tomas petricek討論了非同步c 中常見的7項錯誤...

C 中的陷阱 一

導言 程式語言中充滿陷阱,一不小心就會掉入其中萬劫不復,之所以有陷阱,是因為語言的設計細節不符合程式設計師的直覺 所以你會發現,語言越高階越注重順從程式設計師的直覺。c 也有許多陷阱,所謂山不過來,我就過去,因此將c 中易錯點 難點集合於此,會不定期更新。字串與vector 字串字面值與標準庫str...

silverlight非同步陷阱(二)迴圈

由於非同步完成事件不能確定,順序也不能確定,如果把非同步操作放到迴圈內,可能會產生意想不到的結果。下面的程式本意是 迴圈items集合,為每個item賦值。foreach bookrankitem item in items service.loaded bookpagehander service...