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

C# 多執行緒與 WinForm 介面互動實作範例

     編輯:關於C#

核心概念:跨執行緒存取 UI 控制項

WinForm 控制項具有執行緒親和性,非建立執行緒呼叫需透過 Invoke/BeginInvoke 封送。

完整程式碼

public partial class Form1 : Form {
  Thread[] workThreads = new Thread[10];
  public Form1() { InitializeComponent(); }

  delegate void AddItemCallback(string text);

  private void AddItem(string text) {
    if (this.listBox1.InvokeRequired) {
      AddItemCallback d = new AddItemCallback(AddItem);
      this.Invoke(d, new object[] { text });
    }
    else {
      this.listBox1.Items.Add(text);
    }
  }

  public void DataGet() {
    while (true) {
      AddItem("ok");
      Thread.Sleep(1000);
    }
  }

  private void button1_Click(object sender, EventArgs e) {
    for (int i = 0; i < workThreads.Length; i++) {
      if (workThreads[i] == null) {
        workThreads[i] = new Thread(new ThreadStart(DataGet));
        workThreads[i].Name = i.ToString();
        workThreads[i].Start();
      }
      else if (workThreads[i].ThreadState == ThreadState.Aborted || workThreads[i].ThreadState == ThreadState.Stopped) {
        workThreads[i] = new Thread(new ThreadStart(DataGet));
        workThreads[i].Name = i.ToString();
        workThreads[i].Start();
      }
      else {
        workThreads[i].Start();
      }
    }
  }

  private void button2_Click(object sender, EventArgs e) {
    for (int i = 0; i < workThreads.Length; i++) {
      if (workThreads[i] != null && workThreads[i].ThreadState != ThreadState.Stopped && workThreads[i].ThreadState != ThreadState.Aborted) {
        workThreads[i].Abort();
      }
    }
  }
}

關鍵點解析

  • InvokeRequired 檢查是否需封送。
  • 委派 AddItemCallback 封裝 UI 更新邏輯。
  • Invoke 同步封送,確保執行緒安全。
  • 執行緒陣列管理多條工作執行緒的啟動/停止。

原始碼下載:多執行緒與 WinForm 互動範例

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved