winform的窗体控件可以用线程直接调用吗

 我来答
freeeeeewind
2014-02-22 · TA获得超过1万个赞
知道大有可为答主
回答量:3227
采纳率:94%
帮助的人:1330万
展开全部

默认地,不允许其他线程直接存取(调用)Winform中的控件。

要从其他线程中存取Winform控件,可采用以下两种方法之一:

方法1)不进行线程安全的检查

或者

方法2)通过委托的方式


代码如下所示

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            //方法1:不进行跨线程安全检查
            //System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            Thread th1 = new Thread(new ThreadStart(CalNum));
            th1.Start();
        }
 
        private void CalNum()
        {
            //button1.Enabled = false;
 
            int result = 0;
            for (int i = 1; i < 100000000; i++)
            {
                result += i;
            }
 
            SetCalResult(result);
 
            //button1.Enabled = true;
        }
 
        //方法2:检查是否跨线程,然后将方法加入委托,调用委托
        public delegate void SetTextHandler(int result);
        private void SetCalResult(int result)
        {
            if (label2.InvokeRequired == true)
            {
                SetTextHandler set = new SetTextHandler(SetCalResult);//委托的方法参数应和SetCalResult一致
                label2.Invoke(set, new object[] { result }); //此方法第二参数用于传入方法,代替形参result
            }
            else
            {
                label2.Text = result.ToString();
            }
        }
    }
ptlouhong
2014-02-23 · 超过17用户采纳过TA的回答
知道答主
回答量:45
采纳率:0%
帮助的人:33.9万
展开全部
可以,在窗体的创建或者load方法中加入
Control.CheckForIllegalCrossThreadCalls =false;
就可以跨线程调用了。一般小程序自己玩玩可以这样做。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式