• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C#对Windows窗体控件进行线程安全调用摘自MSDN

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

控件名称 的线程访问它。”

以下非线程安全的调用的示例。

 

代码
private void setTextUnsafeBtn_Click(
    
object sender, 
    EventArgs e)
{
    
this.demoThread = 
        
new Thread(new ThreadStart(this.ThreadProcUnsafe));

    
this.demoThread.Start();
}

private void ThreadProcUnsafe()
{
    
this.textBox1.Text = "This text was set unsafely.";
}

 

对 Windows 窗体控件进行线程安全调用


 

对 Windows 窗体控件进行线程安全调用

  1. InvokeRequired 属性。

  2. Invoke

  3. false,则直接调用控件。

Text 属性。

 

代码
private void setTextSafeBtn_Click(object sender, EventArgs e)
{
    
this.demoThread = 
        
new Thread(new ThreadStart(this.ThreadProcSafe));

    
this.demoThread.Start();
}

private void ThreadProcSafe()
{
    
this.SetText("This text was set safely.");
}

private void SetText(string text)
{
    
if (this.textBox1.InvokeRequired)
    {    
        SetTextCallback d 
= new SetTextCallback(SetText);
        
this.Invoke(d, new object[] { text });
    }
    
else
    {
        
this.textBox1.Text = text;
    }
}

 

使用 BackgroundWorker 进行线程安全调用


 

RunWorkerCompleted 事件处理程序调用控件。

使用 BackgroundWorker 进行线程安全调用

  1. 不要调用由此方法中的主线程创建的控件。

  2. 可以调用由此方法中的主线程创建的控件。

  3. RunWorkerCompleted 事件。

  4. RunWorkerAsync 方法。

RunWorkerCompleted 事件处理程序中直接设置。

 

代码
private BackgroundWorker backgroundWorker1;
private void setTextBackgroundWorkerBtn_Click(object sender, EventArgs e)
{
    
this.backgroundWorker1.RunWorkerAsync();
}
private void backgroundWorker1_RunWorkerCompleted(
    
object sender, 
    RunWorkerCompletedEventArgs e)
{
    
this.textBox1.Text = 
        
"This text was set safely by BackgroundWorker.";
}

 

BackgroundWorker

 

示例


 

BackgroundWorker 实现的安全访问。

 

代码
public class Form1 : Form
{
    
delegate void SetTextCallback(string text);
    
private Thread demoThread = null;
    
private BackgroundWorker backgroundWorker1;

    
private TextBox textBox1;
    
private Button setTextUnsafeBtn;
    
private Button setTextSafeBtn;
    
private Button setTextBackgroundWorkerBtn;

    
public Form1()
    {
        InitializeComponent();
    }
    
private void setTextUnsafeBtn_Click(object sender,EventArgs e)
    {
        
this.demoThread =
            
new Thread(new ThreadStart(this.ThreadProcUnsafe));

        
this.demoThread.Start();
    }

    
private void ThreadProcUnsafe()
    {
        
this.textBox1.Text = "This text was set unsafely.";
    }

    
private void setTextSafeBtn_Click(object sender,EventArgs e)
    {
        
this.demoThread =
            
new Thread(new ThreadStart(this.ThreadProcSafe));

        
this.demoThread.Start();
    }

    
private void ThreadProcSafe()
    {
        
this.SetText("This text was set safely.");
    }

    
private void SetText(string text)
    {
        {
            SetTextCallback d 
= new SetTextCallback(SetText);
            
this.Invoke(d, new object[] { text });
        }
        
else
        {
            
this.textBox1.Text = text;
        }
    }
    
private void setTextBackgroundWorkerBtn_Click(object sender, EventArgs e)
    {
        
this.backgroundWorker1.RunWorkerAsync();
    }

    
private void backgroundWorker1_RunWorkerCompleted( object sender,RunWorkerCompletedEventArgs e)
    {
        
this.textBox1.Text =
            
"This text was set safely by BackgroundWorker.";
    }
}

 

 

RunWorkerCompleted 事件的处理程序。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#继承发布时间:2022-07-14
下一篇:
c#在windows服务中使用定时器发布时间:2022-07-14
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap