• 线程间操作无效: 从不是创建控件的线程访问它


    转自原文 线程间操作无效: 从不是创建控件的线程访问它.

    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;
    using System.Threading;
    
    namespace LoginIn
    {
        public partial class Form1 : Form
        {
            delegate void MyDelegate(string name, string code);
            delegate void SetTipDelegate(string tip);
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                string name = txtName.Text;
                string code = txtCode.Text;
                //调用委托,用新线程校验用户名、密码
                MyDelegate myDelegate = new MyDelegate(CheckUser);
                myDelegate.BeginInvoke(name, code, null, null);
            }
    
            void CheckUser(string name, string code)
            {
                Thread.Sleep(2000);
                if (name == "1" && code == "1")
                {
                    SetTip("成功");
                }
                else
                {
                    SetTip("失败");
                }
            }
    
            void SetTip(string tip)
            {
                //是否调用Invoke方法
                if (lbTip.InvokeRequired)
                //if(!从创建控件“lbTip”的线程访问它)
                {
                    //调用委托
                    SetTipDelegate myDelegate = new SetTipDelegate(SetTip);
                    Invoke(myDelegate, tip);
                }
                else
                {
                    lbTip.Text = tip;
                }
            }
    
            private void timer1_Tick(object sender, EventArgs e)
            {
                button1.Text = DateTime.Now.ToString();
            }
        }
    }
    

    2015年8月3日 16:49:27,更新简写版

    protected void button1_Click(object sender,EventArgs e)
            {
                string userName = txtName.Text;
                string userCode = txtCode.Text;
                
                Func<string ,string ,string> d1 = (name, code) =>           
                     (name == "1" && code == "1") ? "成功" : "失败";                            
                            
                d1.BeginInvoke(userName,userCode,ar=>
                               {
                                   string result= d1.EndInvoke(ar);
                                   Action<string> action1=data=>label1.Text=data;
                                   Invoke(action1,result);
                               },
                               null);
            }
    
  • 相关阅读:
    git简单使用
    Kafka初入门简单配置与使用
    Hbase简单配置与使用
    Oozie简单配置与使用
    Flume初入门简单配置与使用
    sqoop简单配置与使用
    Android基础系列合集
    Java 基础系列合集
    TCP 和 UDP 区别
    http get和post区别
  • 原文地址:https://www.cnblogs.com/arxive/p/6697736.html
Copyright © 2020-2023  润新知