如何将 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:
的一种形式
Task.Run
确保 PrintLetter
在 ASP.NET 请求上下文之外运行。 (我假设这是 ASP.NET pre-Core)。
_ =
放弃任务。
所以这将在一个单独的线程中执行PrintLetter
,而不是在返回客户端之前等待它完成。
问题是 fire-and-forget 很危险。这从来都不是一个好的解决方案。幸运的是,新要求(传回字节数组)意味着 fire-and-forget 无论如何都应该被删除。这只剩下这个:
var files = await PrintLetter(cid);
return Ok(File(files, "application/pdf", "Letter.pdf"));
我在 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:
的一种形式Task.Run
确保PrintLetter
在 ASP.NET 请求上下文之外运行。 (我假设这是 ASP.NET pre-Core)。_ =
放弃任务。
所以这将在一个单独的线程中执行PrintLetter
,而不是在返回客户端之前等待它完成。
问题是 fire-and-forget 很危险。这从来都不是一个好的解决方案。幸运的是,新要求(传回字节数组)意味着 fire-and-forget 无论如何都应该被删除。这只剩下这个:
var files = await PrintLetter(cid);
return Ok(File(files, "application/pdf", "Letter.pdf"));