Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 启动/停止';的类的异步/等待版本是什么;服务';任务_C#_Task Parallel Library - Fatal编程技术网

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(

在旧的C#中,我们可能会遇到这样的代码,它允许您启动/停止像后台工作线程一样连续运行的任务(实际上是一个线程)。。。可能是为队列或其他服务:

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。它已经有了一个输入缓冲区,并且可以配置为限制节流/背压场景的大小。这是一个有趣的问题,正常操作停止的东西并没有真正映射到
任务。那么,这意味着什么呢?在这种情况下,仅仅运行一个
线程
是合理的吗?这是一个有趣的观点,正常运行时停止的东西并没有真正映射到
任务
。那么,这意味着什么呢?在这种情况下,仅仅运行
线程
是合理的吗?