C# 启动/停止';的类的异步/等待版本是什么;服务';任务
在旧的C#中,我们可能会遇到这样的代码,它允许您启动/停止像后台工作线程一样连续运行的任务(实际上是一个线程)。。。可能是为队列或其他服务:C# 启动/停止';的类的异步/等待版本是什么;服务';任务,c#,task-parallel-library,C#,Task Parallel Library,在旧的C#中,我们可能会遇到这样的代码,它允许您启动/停止像后台工作线程一样连续运行的任务(实际上是一个线程)。。。可能是为队列或其他服务: class ServiceTask { private Task task; private CancellationTokenSource cancellation = new CancellationTokenSource(); public void Start() { task = Task.Run(
class ServiceTask
{
private Task task;
private CancellationTokenSource cancellation = new CancellationTokenSource();
public void Start()
{
task = Task.Run(() => TaskLoop(),cancellation.Token);
}
public void Stop()
{
cancellation.Cancel();
task.Wait();
}
private void TaskLoop()
{
while(!cancellation.Token.IsCancellationRequested)
{ ... }
}
对于这个粗糙的示例,我深表歉意,但我的问题是,现代的异步/等待等价物会是什么样子?它是否像等待任务而不是等待任务一样简单
(澄清一下:在我的示例中,这可能看起来像一个实际的服务,但我的问题是关于这个代码模式的……完整的真实代码太大太复杂,无法发布所有细节)异步/等待和启动/停止可能看起来相似,但它们具有不同的语义 使用async/await的任务旨在表示自行完成的任务。主要的工作流程是在创建时启动,并将自行完成。取消机制不是主要流程 开始/停止有不同的语义,因为它永远不会自己结束。它将继续运行,直到调用Stop。虽然它可以自行停止,但主要的流程是它将不可靠地运行
综上所述,我可以得出结论,Task/async/await和start/stop语义在现代C#世界中都有自己的位置。它们都处理不同的操作模式。只是因为任务的用例更常见,所以任务更可见,使用也更多。异步/等待和启动/停止可能看起来相似,但它们有不同的语义 使用async/await的任务旨在表示自行完成的任务。主要的工作流程是在创建时启动,并将自行完成。取消机制不是主要流程 开始/停止有不同的语义,因为它永远不会自己结束。它将继续运行,直到调用Stop。虽然它可以自行停止,但主要的流程是它将不可靠地运行
综上所述,我可以得出结论,Task/async/await和start/stop语义在现代C#世界中都有自己的位置。它们都处理不同的操作模式。只是因为任务的用例更常见,所以任务更可见,使用也更多。看看这一点,它不会启动/停止任何事情,也不会映射到线程。这是一个“现代”示例-
Task.Run()
与async/await
一起引入。Stop
方法从一开始就可以是async Stop(){…;wait…}
。不过,最大的问题是它会永远阻止线程池线程,以执行同步工作。这里有几个HostedService示例坦率地说,不需要包装器类。实现工作程序的更好方法是使用eg ActionBlock,它也在.NET 4.5中引入,并让它异步处理发送给它的消息。默认情况下,它一次处理1条消息,但可以使用更高的DOP。它已经有一个输入缓冲区,可以配置为限制节流/背压场景的大小。请看一看,这不会启动/停止任何操作,也不会映射到线程。这是一个“现代”示例-Task.Run()
与async/await
一起引入。Stop
方法从一开始就可以是async Stop(){…;wait…}
。不过,最大的问题是它会永远阻止线程池线程,以执行同步工作。这里有几个HostedService示例坦率地说,不需要包装器类。实现工作程序的更好方法是使用eg ActionBlock,它也在.NET 4.5中引入,并让它异步处理发送给它的消息。默认情况下,它一次处理1条消息,但可以使用更高的DOP。它已经有了一个输入缓冲区,并且可以配置为限制节流/背压场景的大小。这是一个有趣的问题,正常操作停止的东西并没有真正映射到任务。那么,这意味着什么呢?在这种情况下,仅仅运行一个线程
是合理的吗?这是一个有趣的观点,正常运行时停止的东西并没有真正映射到任务
。那么,这意味着什么呢?在这种情况下,仅仅运行线程
是合理的吗?