Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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#_Multithreading_Resources_Synchronization - Fatal编程技术网

C# 与多个独立线程的同步

C# 与多个独立线程的同步,c#,multithreading,resources,synchronization,C#,Multithreading,Resources,Synchronization,我的应用程序有大量线程同时运行。完成后,他们必须(随机)睡眠一段时间,然后重新开始 如何用更少的资源重新启动它们?我不想在RAM中的所有线程都处于睡眠状态时保存它们,因为线程的数量是巨大的。 另一个毫无意义的解决方案是让每个线程都有自己的计时器 有什么最佳实践可以解决我的问题吗?您可能想研究线程池。这意味着您可以启动较少数量的线程,然后让它们保持活动状态,并让每个线程一个接一个地执行多个作业。通常,他们将从共享队列中提取作业 NET平台对线程池有一些内置的支持 下面是一篇MSDN文章,介绍了执行

我的应用程序有大量线程同时运行。完成后,他们必须(随机)睡眠一段时间,然后重新开始

如何用更少的资源重新启动它们?我不想在RAM中的所有线程都处于睡眠状态时保存它们,因为线程的数量是巨大的。 另一个毫无意义的解决方案是让每个线程都有自己的计时器


有什么最佳实践可以解决我的问题吗?

您可能想研究线程池。这意味着您可以启动较少数量的线程,然后让它们保持活动状态,并让每个线程一个接一个地执行多个作业。通常,他们将从共享队列中提取作业

NET平台对线程池有一些内置的支持

下面是一篇MSDN文章,介绍了执行线程池的一种方法:


您可能需要研究线程池。这意味着您可以启动较少数量的线程,然后让它们保持活动状态,并让每个线程一个接一个地执行多个作业。通常,他们将从共享队列中提取作业

NET平台对线程池有一些内置的支持

下面是一篇MSDN文章,介绍了执行线程池的一种方法:


除非您需要用于UI控件或传统COM对象的STA线程,否则我不会直接创建任何线程并使用或。有关详细信息,请查看任务并行库(TPL)标记wiki:

更新以解决对问题的评论:

否,任务完成后,应在一段时间后重新启动 (随机)。他们应该一次又一次地做同样的工作,只是用一个简单的方法 重新启动之间的超时。Task.Run(()=>while(true){DoWork(); Thread.Sleep(_random.Next(x,y)}是不好的做法

使用
Thread.Sleep
确实是一种不好的做法,尤其是在池线程上。它可能只适合于测试。请使用异步lambda和
任务。请改用延迟

var task = Task.Run(async() => 
{
    while (true) 
    {
        token.ThrowIfCanncellationRequested();

        DoPeriodicWork();

        await Task.Delay(1000);
    }
}, token);
您不会以这种方式阻止池线程,它将返回到池中,代码将在
wait
之后在另一个池线程上继续(或者甚至可能在同一个线程上,但当然您不应该指望这一点)


注意,这里为
async
lambda创建了一个嵌套任务,它
task.Run
将自动与
task.Unwrap
一起展开。更多信息,请参阅Stephen Toub的博客帖子:。

除非您需要一个STA线程用于UI控件或传统COM对象,否则我不会直接创建任何线程并使用或信息,请检查任务并行库(TPL)标记wiki:

更新以解决对问题的评论:

否,任务完成后,应在一段时间后重新启动 (随机)。他们应该一次又一次地做同样的工作,只需要一个 restarts.Task.Run(()=>while(true){DoWork()之间超时; Thread.Sleep(_random.Next(x,y)}是不好的做法

使用
Thread.Sleep
确实是一种不好的做法,尤其是在池线程上。它可能只适合于测试。请使用异步lambda和
任务。请改用延迟

var task = Task.Run(async() => 
{
    while (true) 
    {
        token.ThrowIfCanncellationRequested();

        DoPeriodicWork();

        await Task.Delay(1000);
    }
}, token);
您不会以这种方式阻止池线程,它将返回到池中,代码将在
wait
之后在另一个池线程上继续(或者甚至可能在同一个线程上,但当然您不应该指望这一点)


请注意,此处为
async
lambda创建了一个嵌套任务,该任务
task.Run
将自动使用
task.Unwrap
。有关此问题的详细信息,请参阅Stephen Toub的博文:。

如果线程处于睡眠状态,并且内存不足,则线程堆栈、代码和数据都可以分页。您发现实际问题了吗?我很抱歉sing Task.运行以启动这些线程。但启动或共享这些线程不是问题。大量线程是必要的。我不想保留它们,因为一段时间后,1/3的线程处于睡眠模式,我可以使用这些资源启动新线程,因为其他线程什么都不做。我考虑了一个SortedList,然后始终初始化为列表中第一个元素的计时器。如果达到DateTime,则计时器必须获取第一个对象。是否添加了另一个DateTime较小的对象,则计时器必须重新初始化为.1000个线程?如果每个核心的线程数过多,应用程序无法正常工作。我建议在需要时使用任务n代码和框架将使用线程池为您管理线程使用情况。任何需要在dat/etime上运行的操作,我建议使用计时器或系统调度程序。这意味着工作线程。5000个休眠线程在启动后不会影响性能;但它们只会为堆栈提交5 GB的RAM,这需要进行交换内存。如果它处于睡眠状态,则不需要堆栈,如果有5000个线程,则会有5gb的堆栈——当然,它最终会将它们替换掉。如果线程处于睡眠状态,并且内存变短,则线程堆栈、代码、数据都可以分页。您发现实际问题了吗?我正在使用Task.Run启动这些线程。但这不是内存不足的问题启动或共享这些线程。需要大量线程。我不想保留它们,因为一段时间后,1/3的线程处于睡眠模式,我可以使用这些资源启动新的线程,因为其他线程什么都不做。我考虑了一个SortedList和一个计时器,它总是初始化为列表中的第一个元素列表。如果达到DateTime,计时器必须获取第一个对象。如果添加了另一个DateTime较小的对象,则计时器必须重新初始化为.1000个线程?应用程序不能很好地使用每个核心多几个线程。我建议在需要运行代码时使用任务,框架将使用线程池来管理线程你的用法是什么