C#如何禁用在主线程上运行的按钮?

Posted

技术标签:

【中文标题】C#如何禁用在主线程上运行的按钮?【英文标题】:C# how do I disable a button thats running on the main thread? 【发布时间】:2016-09-03 12:12:07 【问题描述】:

我到处寻找答案,我认为这很容易找到,但显然不是。我听说过调用,但我不知道如何使用它或它是什么。 这是我的代码:

    public void Thread1(object sender, EventArgs e)
    
        this.button1.Enabled = false;
        this.textBox2.Clear();
        this.textBox3.Clear();
        this.textBox4.Clear();
        this.textBox6.Text = "£" + "0";
        //Generate 3 random numbers

        Stopwatch timer = new Stopwatch();
        timer.Start();
        this.Refresh();
        //This is only part of this function
    

    private void button1_Click(object sender, EventArgs e)
    
        ThreadStart threadStart = new ThreadStart(() => Thread1(sender, e));
        Thread newThread = new Thread(threadStart);
        newThread.Start();
    

【问题讨论】:

SafeInvoke 是线索。永远不要尝试从线程更新 UI 组件。在 MSDN 中查找。 你为什么要在另一个线程中进行更新? 【参考方案1】:

在后台线程中,在WinForms组件上使用Invoke()在UI线程上执行代码:

this.Invoke( () => 
    this.button1.Enabled = true;
    this.textBox2.Text = "whatever";
 );

文档:https://msdn.microsoft.com/en-us/library/a1hetckb.aspx

【讨论】:

感谢工作:) 但是我需要编辑它。现在是这个; 'this.Invoke(new Action () => this.button1.Enabled = true; this.textBox2.Text = "whatever"; );'

以上是关于C#如何禁用在主线程上运行的按钮?的主要内容,如果未能解决你的问题,请参考以下文章

如何在主线程上安全地使用[NSTask waitUntilExit]?

Android:如何在所有后台线程完成后启用按钮

c# 多线程运行时出现主界面卡死现象如何解决?

在主线程开始运行之前捕获新的进程事件

C#如何回到主线程,如何在委托指定线程执行

GCD主队列是不是必须在主线程上执行?