0

リマインダー用の小さなアプリケーションを書いています。これについては、Stack Overflow の同様の質問と回答から大きな助けを得ました。こちらからThunderが言及したコードを使用しました。

関連するコードは次のとおりです。

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 に答える