2012-11-07 37 views
0

早上全部,C#线程,线程不持久

使用C#.NET 4.0和Visual Studio 2012 Express。

我有一个程序运行一些SQL存储过程,然后打开和Access数据库并自动生成报告,然后通过电子邮件发送。

我把它设置在一个日期,所以它会在午夜来临时运行。

以下是代码示例。

private void button1_Click(object sender, EventArgs e) 
{ 
    Thread myUltiThread = new Thread(GetCurrentDate); 
    myUltiThread.Start(); 
} 

private void GetCurrentDate() 
{ 
    string myDate = ""; 
    myDate = DateTime.Today.Day.ToString(); 

    if(myDate == "7" && myDateToggle == false) 
    { 
     Task t = new Task(() => RunMonthBackUp()); 
     t.Start(); 
    } 

    if (myDate == "8" && myDateToggle == true) 
    { 
     myDateToggle = false; 
    } 
} 

因此,大家可以看到,一旦按下按钮,我的程序,然后启动该线程,它使用getDate方法,这种方法检查日期是正确的。

如果是,那么它启动一个运行整个过程的任务。

我的问题是,这没有发生,我相信它是因为该方法只运行一次。我有一种感觉,这是由于我对线程不太了解(通常只处理任务)。

有人能指出我哪里错了,以及如何正确地设置此设置?

非常感谢你们

回答

1

你的线程将被终止执行。您应该在您的方法中提供一个循环,并定期检查该情况。或者您可以设置一个定时器(System.Threading.Timer)来定期检查条件。

这是第一种方式:

private void button1_Click(object sender, EventArgs e) 
{ 
    Thread myUltiThread = new Thread(GetCurrentDate); 
    myUltiThread.IsBackground = true; 
    myUltiThread.Start(); 
} 

private void GetCurrentDate() 
{ 
    while(true) 
    { 
     int = DateTime.Today.Day; 

     if(myDate == 7 && myDateToggle == false) 
     { 
      Task t = new Task(() => RunMonthBackUp()); 
      t.Start(); 
     } 

     if (myDate == 8 && myDateToggle == true) 
     { 
      myDateToggle = false; 
     } 

     Thread.Sleep(1); 
    } 
} 

我也做了线程后台线程,所以你不必担心终止线程。线程将继续运行,直到程序退出。

+0

你的父亲是一个传奇,为什么我没有想到一个简单的循环内的方法。可能不是干净的解决方案,但好的和简单的几乎没有额外的代码+1给你先生! – lemunk

+0

你可能不想检查经常的日期!为此,您最好使用Forms.Timer启动备份。为了减少浪费,请每隔半小时检查一次时间/日期,例如,直到备份时间到达前一小时。然后每分钟检查一次,直到最后几分钟,然后计算剩余时间到午夜的时间,并将计时器最后一次设置为该值。 –

+0

@StevenSmith哦!我忘了一件事。请在循环中放置一个'Thread.Sleep(1)'。这样线程不会吃掉CPU。感谢@Martin。 –

1

你的方法只能作为你没有代码重复检查的时间,它已经完成,然后再运行一次。

您需要启动一个定时器,每天激活一次,然后从中调用GetCurrentDate

还是最好还是把代码编写成一个简单的程序,它只执行一次任务并将其作为一个计划任务运行。

1

为什么不这样做?

private void button1_Click(object sender, EventArgs e) 
    { 
     Task.Factory.StartNew(() => GetCurrentDate()); 
    } 

    private void GetCurrentDate() 
    { 
     if (DateTime.Today.Day == 7 && myDateToggle == false) 
     { 
      Task.Factory.StartNew(() => RunMonthBackUp()); 
     } 
     else if (DateTime.Today.Day == 8 && myDateToggle == true) 
     { 
      myDateToggle = false; 
     } 
    } 

如果别的东西是不对的,它让你怪“切换”时GetCurrentDate方法到达终点