加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – ThreadPool如何直接访问另一个线程的控件?

发布时间:2020-12-16 01:45:49 所属栏目:百科 来源:网络整理
导读:我听说线??程无法直接访问其他线程的控件. 所以我们的教授给了我们一个片段 private void UpdateUI(){ if(this.InvokeRequired) this.Invoke(new MethodInvoker(UpdateUI)); else this.Refresh();} 并说InvokeRequired属性返回false,它的线程不是控件的所有
我听说线??程无法直接访问其他线程的控件.

所以我们的教授给了我们一个片段

private void UpdateUI()
{
    if(this.InvokeRequired)
        this.Invoke(new MethodInvoker(UpdateUI));
    else
        this.Refresh();
}

并说InvokeRequired属性返回false,它的线程不是控件的所有者,然后我们应该调用Invoke()方法告诉所有者线程执行UpdateUI()方法.然后,它会更新UI.

但最近,出于好奇,我评论了InvokeRequired和Invoke()

private void UpdateUI()
{
    //if(this.InvokeRequired)
        //this.Invoke(new MethodInvoker(UpdateUI));
    //else
        this.Refresh();
}

并且惊讶地发现ThreadPool可以访问另一个线程的控件,现在我觉得我还没有完全理解ThreadPool的概念.

这是完整的代码.

using System;
using System.Threading;
using System.Drawing;
using System.Windows.Forms;

class MainForm : Form
{
    public MainForm()
    {
        this.Text = "Hello WinForms";
        ThreadPool.QueueUserWorkItem(Clock);
    }

    private void Clock(object state)
    {
        for(;;)
        {
            Thread.Sleep(1000);
            UpdateUI();
        }
    }

    private void UpdateUI()
    {
        //if(this.InvokeRequired)
        //    this.Invoke(new MethodInvoker(UpdateUI));
        //else
            this.Refresh();
    }

    protected override void OnPaint(PaintEventArgs pe)
    {
        using(Pen pen = new Pen(Color.Red,2))
            pe.Graphics.DrawRectangle(pen,20,125,30);

        pe.Graphics.DrawString(DateTime.Now.ToString(),this.Font,Brushes.Blue,25,30);
    }

    [STAThread]
    public static void Main()
    {
        Application.Run(new MainForm());
    }
}

有人可以解释一下这是怎么发生的吗?

谢谢.

解决方法

在您发布的应用程序中,您没有从ThreadPool访问任何控件,您只在窗体上调用Refresh.这实际上向表单发送一条消息告诉自己重绘自己,但是在主GUI线程而不是ThreadPool线程上接收到该消息.

因此,您不需要在您的情况下调用,因为您不进行任何跨线程活动. OnPaint方法通过Windows消息泵间接调用,而不是直接从Refresh方法调用.

例如,如果您尝试从后台线程设置文本框的文本…它将引发异常,并且您将需要使用Invoke模式使其工作.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读