如何将 Task.Run(等待 returns byte[] 的一些异步函数)分配给变量

How to assign Task.Run(await some async function that returns byte[]) to a variable

我在 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。 任何建议

您可以 await 现有 Task.Run 调用的结果:

byte[] bytes =  await Task.Run(async () => await PrintLetter(cid));

在这种情况下,async/await 可以安全地来自 lambda elided。下面代码的行为是相同的:

byte[] bytes =  await Task.Run(() => PrintLetter(cid));

虽然删除 Task.Run 不是 no-op。可能没问题,也可能不行。您可以查看此问题以获取指导:

_ = Task.Run(async () => await PrintLetter(cid));

所以,这实际上是 fire-and-forget:

的一种形式
  1. Task.Run 确保 PrintLetter 在 ASP.NET 请求上下文之外运行。 (我假设这是 ASP.NET pre-Core)。
  2. _ = 放弃任务。

所以这将在一个单独的线程中执行PrintLetter,而不是在返回客户端之前等待它完成。

问题是 fire-and-forget 很危险。这从来都不是一个好的解决方案。幸运的是,新要求(传回字节数组)意味着 fire-and-forget 无论如何都应该被删除。这只剩下这个:

var files =  await PrintLetter(cid);
return Ok(File(files, "application/pdf", "Letter.pdf"));