我在c#中有一個函式,呼叫它
public async Task<byte[]> PrintLetter(int Id)
{
some code here
return byte[2125];
}
我這樣稱呼它:(不確定 _ 的意義是什么)
_ = Task.Run(async () => await PrintLetter(cid));
它正在運行列印作業并且作業正常。但現在我想將它分配PrintLetter()給一個變數,這樣我就可以傳遞它byte[]而不僅僅是列印到列印機。
所以我想這樣做:
var files = await PrintLetter(cid);
return Ok(File(files, "application/pdf", "Letter.pdf"));
但是我很緊張盲目地洗掉Task.Run這里。任何建議
uj5u.com熱心網友回復:
您可以只是await現有Task.Run呼叫的結果:
byte[] bytes = await Task.Run(async () => await PrintLetter(cid));
在這種情況下,可以安全地從 lambda 中洗掉async/await。下面代碼的行為是相同的:
byte[] bytes = await Task.Run(() => PrintLetter(cid));
洗掉Task.Run它不是一個空操作。可能沒問題,也可能不行。您可以查看此問題以獲取指導:await Task.Run vs await
uj5u.com熱心網友回復:
_ = Task.Run(async () => await PrintLetter(cid));
所以,這實際上是一種即發即棄的形式:
Task.Run確保在PrintLetterASP.NET 請求背景關系之外運行。(我假設這是 ASP.NET pre-Core)。_ =放棄任務。
所以這將PrintLetter在一個單獨的執行緒中執行,并且在回傳客戶端之前不會等待它完成。
問題是“即發即棄”是危險的。這從來都不是一個好的解決方案。幸運的是,新要求(傳回位元組陣列)意味著無論如何都應該洗掉即發即棄。這只是留下了這個:
var files = await PrintLetter(cid);
return Ok(File(files, "application/pdf", "Letter.pdf"));
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/432441.html
上一篇:'()=>Promise<string>'型別的引數不能分配給'Promise<string>'型別的引數。ts(2345)
