首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 多線程讀取多文件到同一 TextBox:委托跨線程更新 UI

     編輯:關於C語言

目錄下大量小文本文件,需多線程並發讀取並追加顯示到單一 `TextBox`,使用委托 `Invoke` 確保線程安全。

完整實現

public partial class Form1 : Form {
    private delegate void ReadFileDelegate(object filePath);

    private void btnStart_Click(object sender, EventArgs e) {
        using (var fbd = new FolderBrowserDialog()) {
            if (fbd.ShowDialog() == DialogResult.OK) {
                var di = new DirectoryInfo(fbd.SelectedPath);
                foreach (var fi in di.GetFiles("*.txt")) {
                    var t = new Thread(InvokeThread);
                    t.Start(fi.FullName);
                }
            }
        }
    }

    private void InvokeThread(object filePath) {
        if (this.InvokeRequired)
            this.Invoke(new ReadFileDelegate(ReadFileContent), filePath);
        else
            ReadFileContent(filePath);
    }

    private void ReadFileContent(object filePath) {
        textBox1.AppendText(File.ReadAllText(filePath.ToString(), Encoding.Default));
        textBox1.AppendText("\r\n");
    }
}

關鍵點

  • `InvokeRequired` 檢查是否需跨線程調用
  • 委托簽名匹配 `object` 參數,兼容 `Thread.Start` 傳參
  • `AppendText` 比 `Text +=` 高效,不觸發完整重繪
  • 未限制線程數,大量文件時建議用 `ThreadPool` 或 `Parallel.ForEach`

現代化改寫


// .NET 4.5+ 推薦
var files = Directory.EnumerateFiles(path, "*.txt");
await Task.WhenAll(files.Select(f => Task.Run(() => {
    string content = File.ReadAllText(f);
    this.Invoke(() => textBox1.AppendText(content + "\r\n"));
})));
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved