在finally中呼叫乙個需要await的方法

2021-09-08 10:24:07 字數 1301 閱讀 7163

最近在把code改寫成async+await的形式,發現有些情況下需要在finally中需要呼叫非同步方法,但是編譯器不允許在cache和finally**現await關鍵字。。。但是用wait()或者result又會導致一些其他稀奇古怪的毛病(死鎖啦,aggregateexception啦。。。)

所以,需要找乙個類似於finally的效果,並且允許使用async..await的方式,想了一下,其實這不就是continuewith麼!

對沒有返回值的try..finally可以用下面的方法:

public

static

async task withfinally(this task trycode, funcfinallycode)

為什麼是await await?這個問題要說下continuewith的返回值了,continuewith(action)返回task,所以只需要乙個await。而continuewith(func返回的是task,這裡tresult是task,所以,返回值是task,await task,得到的是另乙個task,顯然任務還沒跑完,接著再等這個task,就有了兩個await了。

來看下使用的示例:

async

task sample()

);

//do something ...

}task trypart()

task asynccallinfinally()

但是如果有trypart返回值哪?於是我們需要這樣的乙個過載:

public

static

async taskwithfinally(this tasktrycode, func, task>finallycode)

這裡假設finally部分不修改try部分的放回值。**裡除了之前的那個await await之外,又加了個return await trycode,這裡為什麼要用await trycode而不是用trycode.result哪?

還記得前面說的那些稀奇古怪的毛病麼?雖然這裡用result不可能出現死鎖(前面的await await已經可以保證finallycode執行完,finallycode又是在trycode完成後跑的,所以此時trycode一定完成了),但是別忘了在出錯的情況下,兩者是有區別的,await trycode會丟擲原來trycode中的異常,而trycode.result會丟擲aggregateexception。

最後,finallycode裡面也要當心乙個陷阱,不要隨便看trycode.result,有可能裡面是個異常!

在乙個xib 中呼叫另外乙個xib

重複使用的控制項類 h 檔案 property strong,nonatomic uiview view property copy,nonatomic nsstring title m 檔案 import sfstatusselectview.h implementation sfstatusse...

Java中在乙個方法中呼叫另乙個方法

在同乙個類中 對於靜態方法,其他的靜態或非靜態方法都可以直接呼叫它。而對於非靜態方法,其他的非靜態方法是可以直接呼叫它的。但是其他靜態方法只有通過物件才能呼叫它。靜態方法不能被非靜態方法覆蓋。public class test2 public void say1 public void say pu...

在乙個py指令碼中呼叫另外乙個py指令碼中的類或函式

1.兩個檔案在同一目錄,直接import即可 2.兩個檔案在不同目錄 在匯入檔案的時候,python只搜尋當前指令碼所在的目錄,載入 entry point 入口指令碼執行目錄和sys.path中包含的路徑例如包的安裝位址。所以如果要在當前指令碼引用其他檔案,除了將檔案放在和指令碼同一目錄下,還有以...