我有一個幫助方法,它需要在try/catch/finally塊中執行lambda,例如我是否可以避免在類似方法中使用同步和異步lambdas的重複代碼?
public void ProcessSpreadsheet(string filename, Action<object[,]> process) {
try {
// Open MS Excel workbook
// Open sheet & extract data into valueArray
// ... more boiler plate ...
process(valueArray);
}
catch (FooException e) {
LogFoo(e.Message);
throw;
}
catch (BarException e) {
LogBar(e.Message);
throw;
}
finally {
// Close workbook, release resources, etc..
}
}
我現在想創建一個接受異步lambda的異步版本。
(注意,我已經閱讀並與斯蒂芬Toub的posts異步過同步同意,但這並不適用於這裏的方法,其中不同步是或不是有益的癥結,提供通過經拉姆達消費者。)
我可以複製並粘貼以上,將其標記爲async
,改變返回類型爲Task
,加上「異步」,以它的名字,改變process
放慢參數的類型Func<object[,],Task>
和變更
process(valueArray);
到
await process(valueArray);
,一切工作正常。但是我想避免重複try/catch/finally中的所有代碼。有沒有一個乾淨的方式來實現這個沒有重複的代碼?
到目前爲止,我已經得到了最好的解決方案是:
public async Task ProcessSpreadsheetAsync(string filename, Func<object[,],Task> process) {
var asyncTaskComplete = new ManualResetEvent(false);
ProcessSpreadsheet(filename, async valueArray => {
await process(valueArray);
asyncTaskComplete.Set();
});
await Task.Run(() => asyncTaskComplete.WaitOne());
}
,但它的混亂和異常不處理。我想知道是否有另一種方式?
您試圖避免重複的代碼是? try/catch/finally代碼?你爲什麼通過異步版本中的'Task.Run'運行代碼?你試圖用異步版本實現什麼功能? –
@YacoubMassad是的,這應該是Func,我修正了,謝謝。 –
eoinmullan
這段代碼真的有用嗎?被'process'拋出的異常被catch塊捕獲了嗎? –