|
分類:[.NET 全般]
フォームにlabel1, label2を貼り付けて
timer1.Enabled = true, timer1.Interval = 100 に設定し、
以下のようなプログラムを作ってみたところ
終了時に
this.Invoke(delegatemethod, new object[] { label });
のところでエラーが出ます。
@これを回避するにはどうすればよいのでしょうか?
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
delegate void SetLabelCallback(Label label);
private void Setlabel(Label label)
{
if (label.IsDisposed) return;
if (label.InvokeRequired)
{
SetLabelCallback delegatemethod = new SetLabelCallback(Setlabel);
this.Invoke(delegatemethod, new object[] { label });
} else label.Text = DateTime.Now.ToString("hh:mm:ss");
}
private void Form1_Load(object sender, EventArgs e)
{
Thread t_time = new Thread(new ThreadStart(TimeView));
t_time.Start();
/*
Task.Run・・・・ ←使い方がわからない
*/
// 以下通常処理
}
private void TimeView()
{
while (true)
{
Setlabel(label2);
Thread.Sleep(100);
}
}
private void timer1_Tick(object sender, EventArgs e)
{
label1.Text = DateTime.Now.ToString("hh:mm:ss");
}
}
また、.net4 以降では Thread ではなく Task を使うことが推奨されていますが
ネットを調べてみると
Task.Run( () => {} )
のようになっていますが、RUNが見つかりません。
A上記の使い方でTaskを使用するにはどうすればよいのでしょうか?
B今回のように時間を表示する場合で、
Thread.Sleep()を使用した場合はTimer,Threadの処理が
停止してしまうのですが、Thread.Sleep()中でも動作させることはできるのでしょうか?
C今回の場合はTimerとThreadのどちらを使うのがよいのでしょうか?
また、TimerとThread(またはTask)を使いわける判断を教えてください。
|