如何在C#中运行数量可变的并发参数化无限循环类型的线程?

如何在C#中运行数量可变的并发参数化无限循环类型的线程?,c#,.net,multithreading,azure,azure-service-fabric,C#,.net,Multithreading,Azure,Azure Service Fabric,我正在创建我的第一个基于C#/.NET的多线程应用程序,它将在Azure Service Fabric集群上运行。正如标题所说,我希望运行数量可变的并发参数化无限循环类型的线程,这些线程将利用RunAsync方法 每个子线程的外观如下所示: public async Task childThreadCall(...argument list...) { while (true) { t

我正在创建我的第一个基于C#/.NET的多线程应用程序,它将在Azure Service Fabric集群上运行。正如标题所说,我希望运行数量可变的并发参数化无限循环类型的线程,这些线程将利用RunAsync方法

每个子线程的外观如下所示:

        public async Task childThreadCall(...argument list...)
        {
            while (true)
            {
                try
                {
                    //long running code
                    //do something useful here
                    //sleep for an independently parameterizable period, then wake up and repeat
                }
                catch (Exception e)
                {
                    //Exception Handling
                }
            }
        }
        protected override async Task RunAsync(CancellationToken cancellationToken)
        {
            try
            {
                for (int i = 0; i < input.length; i++)
                {
                    ThreadStart ts[i] = new ThreadStart(childThreadCall(...argument list...));
                    Thread tc[i] = new Thread(ts);
                    tc[i].Start();
                }
            }
            catch (Exception e)
            {
                //Exception Handling
            }
        }

在RunAsync方法中调用的此类子线程的数量是可变的。我想这样做:

        public async Task childThreadCall(...argument list...)
        {
            while (true)
            {
                try
                {
                    //long running code
                    //do something useful here
                    //sleep for an independently parameterizable period, then wake up and repeat
                }
                catch (Exception e)
                {
                    //Exception Handling
                }
            }
        }
        protected override async Task RunAsync(CancellationToken cancellationToken)
        {
            try
            {
                for (int i = 0; i < input.length; i++)
                {
                    ThreadStart ts[i] = new ThreadStart(childThreadCall(...argument list...));
                    Thread tc[i] = new Thread(ts);
                    tc[i].Start();
                }
            }
            catch (Exception e)
            {
                //Exception Handling
            }
        }

受保护的覆盖异步任务RunAsync(CancellationToken CancellationToken)
{
尝试
{
for(int i=0;i

因此,基本上每个子线程都独立于其他线程运行,并且永远保持这样的运行。有可能做这样的事吗?有人能给我指出正确的方向吗?是否有任何陷阱需要注意?

在服务启动时调用
RunAsync
方法。所以是的,它可以用来做你想做的事。我建议使用任务,因为它们可以很好地处理取消令牌。这是一份草稿:

受保护的覆盖异步任务RunAsync(CancellationToken CancellationToken)
{
var tasks=新列表();
尝试
{
for(int i=0;i
关于陷阱,在使用任务时,通常需要考虑很多事情

请记住,任务最适合于I/O绑定的工作。如果您可以发布在长时间运行的流程中所做的具体操作,那么我可能会改进答案以最适合您的用例

重要的一点是要尊重传递给RunAsync方法的取消令牌,因为它指示服务即将停止。它使您有机会优雅地停止工作。从:

确保传递给RunAsync(cancellationToken)的cancellationToken得到尊重,一旦发出信号,RunAsync(cancellationToken)将尽快优雅地退出。请注意,如果RunAsync(cancellationToken)已完成其预期工作,则它不需要等待cancellationToken发出信号,并且可以优雅地返回


正如您在我的代码中所看到的,我将
CancellationToken
传递给子方法,以便它们能够对可能的取消做出反应。在您的情况下,将由于无休止的循环而成为取消。

在服务启动时调用
RunAsync
方法。因此,可以使用它来执行您想要的操作。我建议t使用任务,因为它们可以很好地使用取消令牌。下面是一个草稿:

受保护的覆盖异步任务RunAsync(CancellationToken CancellationToken)
{
var tasks=新列表();
尝试
{
for(int i=0;i
关于陷阱,在使用任务时,通常需要考虑很多事情

请记住,任务最适合于I/O绑定的工作。如果您可以发布在长时间运行的流程中所做的具体操作,那么我可能会改进答案以最适合您的用例

重要的一点是要尊重传递给RunAsync方法的取消令牌,因为它指示服务即将停止。它使您有机会优雅地停止工作。从:

确保传递给RunAsync(cancellationToken)的cancellationToken得到尊重,一旦发出信号,RunAsync(cancellationToken)将尽快优雅地退出。请注意,如果RunAsync(cancellationToken)已完成其预期工作,则它不需要等待cancellationToken发出信号,并且可以优雅地返回


正如您在我的代码中所看到的,我将
CancellationToken
传递给子方法,以便它们能够对可能的取消做出反应。在您的情况下,将因为无休止的循环而成为取消。

我将避开线程类,除非您有一个特定的用例,因为它有多长?我们是什么样的工作