0

大家早,

使用 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 方法,该方法检查日期是否正确。

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

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

有人可以向我指出我哪里出错以及如何正确设置吗?

非常感谢各位

4

3 回答 3

1

您的方法只运行一次,因为您没有代码在完成后重复检查时间。

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

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

于 2012-11-07T11:21:14.163 回答
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;
        }
    }

如果这有其他问题,则与您奇怪的“切换”有关

于 2012-11-07T11:27:25.977 回答
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);
    }
}

我还将线程设置为后台线程,因此您无需担心终止线程。线程将继续运行,直到程序退出。

于 2012-11-07T11:54:35.913 回答