C#线程,线程不持久
早上好 使用C#.NET 4.0和Visual Studio 2012 Express 我有一个程序,运行一些SQL存储过程,然后打开并访问数据库,自动生成报告,然后发送电子邮件给他们 我把它定在一个日期,所以它在午夜一到就开始运行 下面是一个代码示例C#线程,线程不持久,c#,multithreading,C#,Multithreading,早上好 使用C#.NET 4.0和Visual Studio 2012 Express 我有一个程序,运行一些SQL存储过程,然后打开并访问数据库,自动生成报告,然后发送电子邮件给他们 我把它定在一个日期,所以它在午夜一到就开始运行 下面是一个代码示例 private void button1_Click(object sender, EventArgs e) { Thread myUltiThread = new Thread(GetCurrentDate); myUltiTh
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方法,这个方法检查日期是否正确
如果是,则启动运行整个流程的任务
我的问题是,这种情况不会发生,我相信这是因为该方法只运行了一次。我有一种感觉,这是因为我不了解如何使用线程(通常只处理任务)
有人能告诉我哪里出了问题,以及如何正确设置吗
非常感谢各位您的方法只运行一次,因为您没有代码在检查完成后的一段时间内重复检查 您需要启动一个每天激活一次的计时器,然后从中调用
GetCurrentDate
或者最好还是将代码编写为一个简单的程序,只执行一次任务,并将其作为计划任务运行。您的方法只运行一次,因为您没有代码在完成检查后的一段时间内重复检查 您需要启动一个每天激活一次的计时器,然后从中调用
GetCurrentDate
或者最好还是将代码编写为一个简单的程序,只执行一次任务,并将其作为计划任务运行。为什么不这样做
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;
}
}
如果这有什么问题,那是因为你奇怪的“切换”为什么不这样做呢
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
方法结束时,您的线程将被终止。您应该在方法中提供一个循环,并定期检查条件。或者您可以设置一个计时器(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);
}
}
我还将线程设置为背景线程,因此您不必担心终止线程。线程将继续运行,直到程序退出。当
GetCurrentDate
方法到达末尾时,线程将终止。您应该在方法中提供一个循环,并定期检查条件。或者您可以设置一个计时器(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);
}
}
我还将线程设置为背景线程,因此您不必担心终止线程。线程将继续运行,直到程序退出。您是一个传奇,为什么我没有想到在方法中有一个简单的循环。可能不是最干净的解决方案,但很好和简单,几乎没有额外的代码+1给你先生!您可能不想经常查看日期!为此,最好使用Forms.Timer启动备份。为了减少浪费,每半小时检查一次时间/日期,比如说,直到备份时间到来的前一小时。然后每分钟检查一次,直到最后几分钟,然后计算到午夜还有多少毫秒,最后一次将计时器设置为该值。@StevenSmith噢!我忘了一件事。请在循环中放置一个
线程。Sleep(1)
。这样线程就不会占用CPU。感谢@Martin.you sire是一个传奇,为什么我没有想到方法中的一个简单循环呢。可能不是最干净的解决方案,但很好和简单,几乎没有额外的代码+1给你先生!您可能不想经常查看日期!为此,最好使用Forms.Timer启动备份。为了减少浪费,每半小时检查一次时间/日期,比如说,直到备份时间到来的前一小时。然后每分钟检查一次,直到最后几分钟,然后计算到午夜还有多少毫秒,最后一次将计时器设置为该值。@StevenSmith噢!我忘了一件事。请在循环中放置一个线程。Sleep(1)
。这样线程就不会占用CPU。感谢@Martin。