.NET ez 2012-06-04
WinFrom在執行緒下存取From上的物件會出現以下錯誤:
此時有三種方式可以解決,建議使用委派方式:
直接允許Cross Thread:
在WinFrom Load中加入:Form.CheckForIllegalCrossThreadCalls = false;
using System;
using System.Threading;
using System.Windows.Forms;
namespace Test
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//執行緒變數
private Thread thread;
private void Form1_Load(object sender, EventArgs e)
{
Form.CheckForIllegalCrossThreadCalls = false;
thread = new Thread(() =>
{
int x = 0;
while (++x > 0) ShowText(x);
});
thread.Start();
}
//顯示文字到label
private void ShowText(int i)
{
label1.Text = i.ToString();
}
//表單關閉中
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (thread.ThreadState != ThreadState.Stopped) thread.Abort();
}
}
}透過Timer定時更新物件:
using System;
using System.Threading;
using System.Windows.Forms;
namespace Test
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//執行緒變數
private Thread thread;
private int x = 0;
private void Form1_Load(object sender, EventArgs e)
{
thread = new Thread(() =>
{
while (++x > 0) ;
});
thread.Start();
System.Windows.Forms.Timer T = new System.Windows.Forms.Timer();
T.Tick += new EventHandler(T_Tick);
T.Interval = 1;
T.Start();
}
private void T_Tick(object sender, EventArgs e)
{
ShowText(x);
}
//顯示文字到label
private void ShowText(int i)
{
label1.Text = i.ToString();
}
}
}採用委派方式 (建議):
using System;
using System.Threading;
using System.Windows.Forms;
namespace Test
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//執行緒變數
private Thread thread;
//定義委派
private delegate void deg(int i);
private void Form1_Load(object sender, EventArgs e)
{
thread = new Thread(() =>
{
//建立委派物件
deg d = new deg(ShowText);
int x = 0;
while (++x > 0) this.Invoke(d, x);
});
thread.Start();
}
//顯示文字到label
private void ShowText(int i)
{
label1.Text = i.ToString();
}
//表單關閉中
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (thread.ThreadState != ThreadState.Stopped) thread.Abort();
}
}
}標籤: .NET
本文章網址:
https://www.ez2o.com/Blog/Post/csharp-Cross-Thread-Call-Object
https://www.ez2o.com/Blog/Post/48
https://www.ez2o.com/Blog/Post/csharp-Cross-Thread-Call-Object
https://www.ez2o.com/Blog/Post/48
