【发布时间】:2018-07-03 17:19:19
【问题描述】:
我对@987654321@ 以及我在互联网上读到的所有内容感到有些困惑。所以这是我的情况:我有一些处理传入套接字数据的函数:
public async Task Handle(Client client)
{
while (true)
{
var data = await client.ReadAsync();
await this.ProcessData(client, data);
}
}
但这有一个缺点,我只能在处理完最后一个请求后才能读取下一个请求。所以这里有一个修改版:
public async Task Handle(Client client)
{
while (true)
{
var data = await client.ReadAsync();
Task.Run(async () => {
await this.ProcessData(client, data);
});
}
}
这是一个简化的版本。对于更高级的,我当然会限制并行请求的最大数量。
无论如何,这个ProcessData 主要是 IO 绑定的(对 dbs 进行一些调用,非常轻量级的处理并将数据发送回client)但我一直在阅读我应该将Task.Run 与 CPU 绑定函数一起使用。
对于我的情况,Task.Run 的正确用法是否正确?如果没有,还有什么替代方案?
【问题讨论】:
-
@Servy 如何在没有
Task.Run的情况下在后台运行异步函数?问题不在于线程。我看不出链接的帖子是如何相关的。如果您有答案,请随时发布。 -
@freakish 你不需要在后台线程中运行异步函数根本,因此你不需要使用
Task.Run,因为它纯粹存在在后台线程中运行同步方法(您不需要这样做)。您的问题 is 是关于线程的,显然是关于并行性的。它是关于线程的,因为Task.Run的存在是为了在另一个线程中运行一个方法,它是关于并行性,因为您希望并行运行三个操作。您可以查看我的其他答案,了解为什么您根本不需要线程来并行运行操作。 -
@Servy 不过,这确实没有回答评论。问题基本上是“我如何最好地让这个函数运行,以便可以使用下一个客户端(而不是等到这个客户端完成处理后再继续)?” OP 最好用“使用 Task.Run”回答。
-
@freakish 它不会(必然)在后台线程中运行,不。它是异步运行的(根据定义,这当然是正确的,因为它是异步的)。该方法在工作完成之前返回,并且该工作将在未来的某个时间完成而无需您的交互这意味着操作是异步的。
-
@freakish 不同的异步操作可以通过多种方式实现它们的异步。他们可以使用线程,或者他们可能根本不需要任何线程来完成他们的工作,就像 IO 绑定工作的情况一样。
标签: c# async-await task-parallel-library