C#线程,线程不持久

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

早上好

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

我有一个程序,运行一些SQL存储过程,然后打开并访问数据库,自动生成报告,然后发送电子邮件给他们

我把它定在一个日期,所以它在午夜一到就开始运行

下面是一个代码示例

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。