c#-跨线程控件访问问题

新手最近遇到这样的问题: a线程去访问b线程的控件,编译器报错。在网上找了一下解决方案,和大家分享下。

解决方法有3:
1, 不安全的方法: Control.CheckForIllegalCrossThreadCalls 设置为false (.net1.0中没有)
2,
安全的方法: 异步委托
3,
安全的方法: 就是使用BackgroundWorker来替代你自己创建的线程(.net1.0中没有)

主要说下第二种方法,实例代码:

 

ContractedBlock.gif ExpandedBlockStart.gif Code
 using System;
 
using System.ComponentModel;
 
using System.Threading;
 
using System.Windows.Forms;
 
 
namespace CrossThreadDemo
  {
     
public class Form1 : Form
      {
         
// This delegate enables asynchronous calls for setting
         
// the text property on a TextBox control.
         delegate void SetTextCallback(string text);
         
         
// This thread is used to demonstrate both thread-safe and
         
// unsafe ways to call a Windows Forms control.
         private Thread demoThread = null;
         
         
// This BackgroundWorker is used to demonstrate the
         
// preferred way of performing asynchronous operations.
         private BackgroundWorker backgroundWorker1;
         
         
private TextBox textBox1;
         
private Button setTextUnsafeBtn;
         
private Button setTextSafeBtn;
         
private Button setTextBackgroundWorkerBtn;
         
         
private System.ComponentModel.IContainer components = null;
         
         
public Form1()
          {
             InitializeComponent();
         }
         
         
protected override void Dispose(bool disposing)
          {
             
if (disposing && (components != null))
              {
                 components.Dispose();
             }
             
base.Dispose(disposing);
         }
         
         
// This event handler creates a thread that calls a
         
// Windows Forms control in an unsafe way.
         private void setTextUnsafeBtn_Click(
         
object sender,
         EventArgs e)
          {
             
this.demoThread =
             
new Thread(new ThreadStart(this.ThreadProcUnsafe));
             
             
this.demoThread.Start();
         }
         
         
// This method is executed on the worker thread and makes
         
// an unsafe call on the TextBox control.
         private void ThreadProcUnsafe()
          {
             
this.textBox1.Text = "This text was set unsafely.";
         }
         
         
// This event handler creates a thread that calls a
         
// Windows Forms control in a thread-safe way.
         private void setTextSafeBtn_Click(
         
object sender,
         EventArgs e)
          {
             
this.demoThread =
             
new Thread(new ThreadStart(this.ThreadProcSafe));
             
             
this.demoThread.Start();
         }
         
         
// This method is executed on the worker thread and makes
         
// a thread-safe call on the TextBox control.
         private void ThreadProcSafe()
          {
             
this.SetText("This text was set safely.");
         }
         
         
// This method demonstrates a pattern for making thread-safe
         
// calls on a Windows Forms control.
         
//
         
// If the calling thread is different from the thread that
         
// created the TextBox control, this method creates a
         
// SetTextCallback and calls itself asynchronously using the
         
// Invoke method.
         
//
         
// If the calling thread is the same as the thread that created
         
// the TextBox control, the Text property is set directly.
         
         
private void SetText(string text)
          {
             
// InvokeRequired required compares the thread ID of the
             
// calling thread to the thread ID of the creating thread.
             
// If these threads are different, it returns true.
             if (this.textBox1.InvokeRequired)
              {
                 SetTextCallback d 
= new SetTextCallback(SetText);
                  
this.Invoke(d, new object[] { text });
             }
             
else
              {
                 
this.textBox1.Text = text;
             }
         }
         
         
// This event handler starts the form's
         
// BackgroundWorker by calling RunWorkerAsync.
         
//
         
// The Text property of the TextBox control is set
         
// when the BackgroundWorker raises the RunWorkerCompleted
         
// event.
         private void setTextBackgroundWorkerBtn_Click(
         
object sender,
         EventArgs e)
          {
             
this.backgroundWorker1.RunWorkerAsync();
         }
         
         
// This event handler sets the Text property of the TextBox
         
// control. It is called on the thread that created the
         
// TextBox control, so the call is thread-safe.
         
//
         
// BackgroundWorker is the preferred way to perform asynchronous
         
// operations.
         
         
private void backgroundWorker1_RunWorkerCompleted(
         
object sender,
         RunWorkerCompletedEventArgs e)
          {
             
this.textBox1.Text =
             
"This text was set safely by BackgroundWorker.";
         }
         
          Windows Form Designer generated code
         
         
         [STAThread]
         
static void Main()
          {
             Application.EnableVisualStyles();
             Application.Run(
new Form1());
         }
         
     }
 }


第三种方法不知道怎么弄,请大家指教。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值