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 - Fatal编程技术网

C# 使用长时间线程睡眠是个好主意吗?

C# 使用长时间线程睡眠是个好主意吗?,c#,multithreading,C#,Multithreading,我有一份工作清单。每个作业都有自己的运行时间。到时候他们需要跑。我认为有两种不同的方式 public class Job { public int JobPeriod {get;set;} // for example as hour: daily = 24, weekly = 7 * 24, monthly = 30 * 24 public DateTime RunTime {get;set} } 第一种方式: 我开始一个新的主线程。此线程以特定的时间间隔(5秒、10秒等

我有一份工作清单。每个作业都有自己的运行时间。到时候他们需要跑。我认为有两种不同的方式

public class Job 
{
    public int JobPeriod {get;set;} // for example as hour: daily = 24, weekly = 7 * 24, monthly = 30 * 24 
    public DateTime RunTime {get;set}
}
第一种方式:

我开始一个新的主线程。此线程以特定的时间间隔(5秒、10秒等)检查作业。当作业的运行时间到来时,主线程将启动并完成作业。以这种方式连续运行的主线程

while (true)
{
   lock (Locker)
   {
       // checks job list.
       var jobs = foo.GetIncomingTimeJobs();
       foreach (var job in jobs)
       {
           ParameterizedThreadStart ts = RunJob;
           var th = new Thread(ts);
           th.Start(job);
       }

       Thread.Sleep(10000);
   }
}

public void RunJob(Job job)
{
   // do somethings
}
第二种方式:

当应用程序启动时,我为作业列表中的每个作业创建一个新线程。所有这些创建的线程都将启动。当作业线程启动时,作业线程检查作业的运行时

例如:

var jobs = foo.GetAllJobs();
foreach (var job in jobs)
{
      ParameterizedThreadStart ts = RunJob;
      var th = new Thread(ts);
      th.Start(job);
}

public void RunJob(Job job)
{
    while (true)
    {
       lock (Locker)
       {
           // do somethings
           var period = job.JobPeriod * 60 * 1000;
           Thread.Sleep(period);
       }
    }
}
如果有十个作业,将有十个线程。这十根线永远不会结束。会睡觉,会继续,会睡觉,会继续


线程睡这么长时间正常吗?我应该用哪种方式?还是有其他方法可以做到这一点?

这两种方法在大多数情况下都是不正确的。解决这类问题的通常方法是使用。您案例的示例代码如下所示:

private void CheckJobs(object state)
{
    lock (Locker)
    {
        // checks job list.
        var jobs = foo.GetIncomingTimeJobs();
        foreach (var job in jobs)
        {
            var thread = new Thread(foo);
            thread.Start();
        }
    }
}

private void StartProcessing()
{
    var timer = new System.Threading.Timer(CheckJobs, null, 0, 10000);
}
调用StartProcessing()函数时,计时器将被初始化,并且每10秒检查一次作业列表


如果使用Thread.Sleep(),应用程序将变得非常无响应。

线程是昂贵的资源。你为什么不用定时器?@nikie我想用线程。没有其他原因。@sinanakyazici-如果你拒绝接受我们的建议,你为什么在这里?你为什么把你的主线放在睡眠中?我看不出这样做有什么好处。您的代码无效,并且容易出现问题,我是根据经验说的。至少你应该使用4.5的功能,比如Task和其他功能。@Ramhound当我说“我想使用线程,没有其他原因”时,我并不是说我不在乎你的想法。这是因为我想知道有没有一种方法可以通过使用线程来解决这个问题。我不知道为什么我必须使用timer。@sinanakyazici:您的代码很可能会工作,但在大多数情况下调用Thread.Sleep()会浪费大量的处理时间和精力。不这样做的另一个原因是休眠线程对外部事件完全没有响应。例如,如果您确实在WinForms应用程序的主GUI线程上睡眠-此应用程序将在指定的时间内冻结,并且不会响应任何用户操作。