zoukankan      html  css  js  c++  java
  • 从非创建控件的线程访问控件

    类testThread

    using System;
    using System.Collections.Generic;
    using System.Text;
    namespace testThread
    {
        
    public class MessageSendEventArgs : EventArgs
        {
            
    public String Message;
            
    public MessageSendEventArgs(string message)
            {
                
    this.Message = message;
            }
        }
        
    class SubThread
        {
            
    public delegate void MessageSendEventHandler(object sender, MessageSendEventArgs e);
            
    //定义事件
            public event MessageSendEventHandler MessageSend;
            
    protected virtual void OnMessageSend(MessageSendEventArgs e)
            {
                
    if (MessageSend != null)
                    MessageSend(
    this, e);
            }
            
    //定义一个线程
            public System.Threading.Thread sendthread;
            
    public void Sendding()
            {
                
    while(true)
                {
                    System.Threading.Thread.Sleep(
    500);
                    
    this.OnMessageSend(new MessageSendEventArgs(DateTime.Now.ToString()));
                }
            }
            
    //开始线程函数
            public void StartSend()
            {
                sendthread 
    = new System.Threading.Thread(new System.Threading.ThreadStart(Sendding));
                sendthread.Start();
            }
            
    //结束线程函数
            public void EndSend()
            {
                sendthread.Abort();
            }
        }
    }

    那么在主窗体内,使用 Control.CheckForIllegalCrossThreadCalls = false;

    可以回到.net1.1默认可以从非主线程修改控件。也可以使用invoke方法。

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;

    namespace testThread
    {
        
    public partial class Form1 : Form
        {

            
    public delegate void MessageHandler(MessageSendEventArgs e);
            SubThread _subthread;                                                      
    //定义一个线程

            
    public Form1()
            {
                InitializeComponent();
               
    // Control.CheckForIllegalCrossThreadCalls = false;
                this._subthread = new SubThread();                                     //创建线程实例
                this._subthread.MessageSend += this._subthread_MessageSend;
                
    //this._subthread.MessageSend += this._subthread_MessageSend;            //订阅事件
            }
            
    public void MessageAdd(MessageSendEventArgs e)
            {
                listBox1.Items.Add(e.Message);
            }

            
    private  void _subthread_MessageSend(object sender, MessageSendEventArgs e)
            {
                 
    //实例化代理
                  MessageHandler handler = new MessageHandler(MessageAdd);
                 
    ////调用Invoke
                this.Invoke(handler, new object[] { e });
                 
    //listBox1.Items.Add(e.Message);
            }

            
    private void button1_Click(object sender, EventArgs e)
            {
                
    this._subthread.StartSend();
                
    this.listBox1.Items.Add("开始....");
            }

            
    private void button2_Click(object sender, EventArgs e)
            {
                
    this._subthread.EndSend();
                
    this.listBox1.Items.Add("停止");
            }

        }
    }
  • 相关阅读:
    Linux的五个查找命令
    jquery mobile图片自适应屏幕
    JS定时刷新页面及跳转页面
    JavaScript-每隔5分钟执行一次ajax请求的实现方法
    jquerymobile-可折叠内容(Collapsible content)
    MVC入门教程-视图中的Layout使用
    如何利用 _ViewStart.cshtml对页面添加代码?
    检测到有潜在危险的Request.Form值
    varchar(n)和varchar(max)有什么区别
    报错:System.Data.Entity.Infrastructure.DbUpdateException 更新条目时出错
  • 原文地址:https://www.cnblogs.com/kakaliush/p/1708463.html
Copyright © 2011-2022 走看看