将来从ThreadPool调度多个线程的有效方法

本文关键字:线程 有效 方法 ThreadPool 调度 将来 | 更新日期: 2023-09-27 18:26:36

我想使用ThreadPool中的线程在不同的时间运行相同的过程。以下是我正在努力实现的目标:

  1. 将项目添加到散列
  2. 记下项目创建的时间,在X0分钟内
  3. 返回并从hash中移除/从/使用项执行某些操作

据我所知,使用.Sleep()来延迟执行是一个糟糕的想法。有什么更好的主意?

(不幸的是,我不能使用任务并行库,并且仅限于.NET 3.5)

将来从ThreadPool调度多个线程的有效方法

我不知道TPL在这里会有什么用处。我不记得其中有任何内容涉及到为未来的执行安排时间。

.NET包括两个不同的基本Timer类(在System.Timers和System.Threading中),以及第三个专门针对Forms的类(如果您正在这样做的话)。这些就是这个特定应用程序的"go-to"API。

您可以考虑的一种替代方案是创建一个占用一个调度任务队列的单个线程,本质上实现您自己的计时器。在那一个线程中,你最终会使用thread.Sleep()。是的,通常人们会想避免这种情况,但在专门用于此目的的专用线程中,这很好。我不知道你是否会发现这比使用一个Timer类更可取,因为我并不真正理解使用一个定时器类的阻力。

请注意,System.Threading.Timer类具有"一次性"模式。通过将Timeout.Infinite作为重复间隔,计时器回调只在经过初始到期时间间隔后执行一次。唯一需要的"管理"是保留对Timer实例的引用,以确保在定时器周期结束之前不会对其进行垃圾收集。

它甚至使用ThreadPool线程。

以下是一种使用Microsoft Reactive Framework(NuGet-Rx-Main)的方法:

var query =
    Observable.Create<HashAction>(o =>
    {
        var hash = "Create Hash Somehow";
        return Observable
            .Return(new HashAction()
            {
                Action = "Add",
                Hash = hash
            })
            .Concat(
                Observable
                    .Timer(TimeSpan.FromMinutes(1.0))
                    .Select(x => new HashAction()
                    {
                        Action = "Remove",
                        Hash = hash
                    }))
            .Subscribe(o);
    });
query.Subscribe(x =>
{
    if (x.Action == "Add")
    {
        /* Add Hash */
    }
    if (x.Action == "Remove")
    {
        /* Remove Hash */
    }
});

现在,这有点做作,因为你没有给出太多关于你想做什么的具体细节。我不明白"向哈希添加项目"是什么意思,更不用说"返回并从哈希中删除/使用项目做某事"是什么了。一个具体的例子会非常有用。