gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 05:31:20 27 4
gpt4 key购买 nike

我正在创建第一个基于 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
}
}
}

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

        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 方法在服务启动时调用。所以是的,它可以用来做你想做的事。我建议使用任务,因为它们可以很好地处理取消标记。这是一个草稿:

protected override async Task RunAsync(CancellationToken cancellationToken)
{
var tasks = new List<Task>();
try
{
for (int i = 0; i < input.length; i++)
{
tasks.Add(MyTask(cancellationToken, i);
}

await Task.WhenAll(tasks);
}
catch (Exception e)
{
//Exception Handling
}
}

public async Task MyTask(CancellationToken cancellationToken, int a)
{
while (true)
{
cancellationToken.ThrowIfCancellationRequested();

try
{
//long running code, if possible check for cancellation using the token
//do something useful here
await SomeUseFullTask(cancellationToken);

//sleep for an independently parameterizable period, then wake up and repeat
await Task.Delay(TimeSpan.FromHours(1), cancellationToken);
}
catch (Exception e)
{
//Exception Handling
}
}
}

关于陷阱,有一个很好的list使用任务时一般要考虑的事情。

请注意,任务最适合 I/O 密集型工作。如果您可以发布在长期运行的过程中到底做了什么,那么我也许可以改进答案以最适合您的用例。

重要的是要尊重传递给 RunAsync 方法的取消 token ,因为它指示服务即将停止。它让您有机会优雅地停止工作。来自 the docs :

Make sure cancellationToken passed to RunAsync(CancellationToken) is honored and once it has been signaled, RunAsync(CancellationToken) exits gracefully as soon as possible. Please note that if RunAsync(CancellationToken) has finished its intended work, it does not need to wait for cancellationToken to be signaled and can return gracefully.

正如您在我的代码中看到的,我将 CancellationToken 传递给子方法,以便它们可以对可能的取消使用react。在您的情况下,由于无限循环,被取消。

关于c# - 如何在 C# 中运行可变数量的并发参数化无限循环类型线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65139824/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com