0

我正在为提醒编写一个小应用程序。为此,我从 Stack Overflow 上的一个类似问题和答案中得到了很大的帮助。我从这里使用了迅雷提到的代码。

相关代码为:

private void Form1_Load(object sender, EventArgs e)
    {
        System.Threading.TimerCallback callback = new            System.Threading.TimerCallback(ProcessTimerEvent);
        var dt =    new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day   , 10, 0, 0);

        if (DateTime.Now < dt)
        {
            var timer = new System.Threading.Timer(callback, null, dt - DateTime.Now, TimeSpan.FromHours(24));
        this.Hide(); // This line works... Form hides itself
        }

    }

    private void ProcessTimerEvent(object obj)
    {
        //MessageBox.Show("Hi Its Time");
        this.Show();  //This line does not work. Form gets disposed off instead of show
    }

我的问题:我得到了该答案中提到的所有内容(包括 MessageBox)。但是,如果我在进行回调时尝试隐藏表单并再次显示它而不是MessageBox.Show("Hi Its Time")它不起作用。请参阅我对每一行的评论。我不明白为什么表格会被处理。

this.Visible() // does not work and disposed off the same way

还尝试通过更改其位置属性将表单移出屏幕。返回时,将其带回其原始位置,但这也不起作用。我可以做些什么来隐藏和显示退货表格?

4

2 回答 2

1

我相信您遇到了跨线程问题。您的回调应如下所示:

private void ProcessTimerEvent(object obj)
{
    if (this.InvokeRequired)
    {
        this.Invoke(new Action<object>(this.ProcessTimerEvent), obj);
    }
    else
    {
         this.Show();
    }
}
于 2012-09-10T06:57:27.963 回答
0

我刚刚检查并发现您的代码出现此错误:

跨线程操作无效:控件“Form1”从创建它的线程以外的线程访问。

您只需将ProcessTimerEvent功能更改为:

if (this.InvokeRequired)
{
    this.BeginInvoke(new Action<object>(ProcessTimerEvent), obj);

    // To wait for the thread to complete before continuing.
    this.Invoke(new Action<object>(ProcessTimerEvent), obj);
}
else
{
    this.Show();
}
于 2012-09-10T07:11:49.650 回答