gpt4 book ai didi

c# - 如何在 C#.NET 的循环中创建不确定的后台线程

转载 作者:太空宇宙 更新时间:2023-11-03 19:24:31 27 4
gpt4 key购买 nike

我有一个循环需要创建数量不确定且数量不确定的后台线程。然后线程将简单地运行到完成,但有些线程可能需要取消。

我最初计划通过声明一个 backgroundWorker,将其添加到列表中,然后更新 BackgroundWorker 以再次开始该过程来实现这一点。但是,因为 List.Add 方法通过引用传入的对象运行,我认为当我新建原始 BackgroundWorker 时,List 引用的线程将丢失(或更糟)。

我的第二个想法是简单地将我的新值分配给数组中的一个元素 (array[i] = new BackgroundWorker()),但这并不适合无限数量的线程。

有没有人对管理这些单独线程的好方法有任何建议?提前致谢。

最佳答案

两条评论 - 一条微观,一条宏观。

首先,TPL 似乎符合您既定的目标。使用 Task.Factory.StartNew(),您将能够产生任意数量的操作,这些操作将在后台线程上运行。此外,使用带有 CancellationToken 的重载,您可以根据需要取消操作。请注意,Task 不等同于 Thread - 默认情况下,Tasks 在 ThreadPool 线程中运行(顺便说一句,后台工作人员也是如此)。您的任务完全有可能最终进入队列,等待池线程可用。

其次,更大的评论。

您声称您将拥有未指定且不确定数量的工作项。你会为每个项目生成一个线程让我有点急躁 - 线程并不便宜,如果你有大量的工作项目,你可以通过天真地启动新线程来饿死你的进程。

你能详细说明你需要用这些线程做什么吗?我不知道什么构成了您项目的工作项,但是具有固定线程数的生产者/消费者设置完全有可能满足您的并行化需求。 .NET 4.0 使 System.Collections.Concurrent 类变得容易。

编辑以回应评论

TCP 连接的情况与我在上面写第二条评论时所想的非常接近。在这种情况下,您正在考虑无限消耗有限的操作系统资源,即打开的套接字。我希望您研究非阻塞 I/O。 This MSDN page记录从套接字异步读取,和this one谈论 .NET 中更大的异步编程模型。

对于可扩展的 TCP 服务,SO 上已经有很好的讨论:peruse at your pleasure .

关于c# - 如何在 C#.NET 的循环中创建不确定的后台线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9834575/

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