{"跨執行緒作業無效: 存取控制項 'listBox1' 時所使用的執行緒與建立控制項的執行緒不同。"}
private void button1_Click(object sender, EventArgs e)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadStart),textBox1.Text);
}
private void ThreadStart(object path)
{
listBox1.Items.Clear();
private void explore(string path)
{
try
{
//使用遞迴搜索所有目錄
foreach (string dir in Directory.GetDirectories(path))
{
explore(dir);
listBox1.Items.Add(dir);
}
foreach (string file in Directory.GetFiles(path))
{
fileCount++;
listBox1.Items.Add(file);
//加總檔案大小
FileInfo fi = new FileInfo(file);
totalSize += fi.Length;
}
}
catch (UnauthorizedAccessException uae)
{
listBox1.Items.Add("Error with :" + uae.ToString());
}
} 當thread碰到winfrom UI thread,不能用此thread去更動UI Thread 內的Control!!
所以借用︰
- 一個Deledgd( 對Contol 處理行為的方法)
- Control.Invork() (為同步呼叫,等待 delegate指向的程式執行完畢才會繼續向下走)
- Conrotl.BeginInvork(是非同步呼叫,呼叫後立即繼續向下執行)
//宣告委派
delegate void UpdateConrtolFunHandar(string path);
//宣告Control控制項的方法
private void funListBox(string dirName)
{
listBox1.Items.Add(dirName);
}
//將原本的寫法用Invok呼叫,已UI Thread 執行 this.Invoke(new UpdateConrtolFunHandar(funListBox),dir); //listBox1.Items.Add(dir);
Reference:
沒有留言:
張貼留言