多线程和异步编程的那些事 (七)

带参数的Invoke.

 //【2】定义委托变量
        DelegateShowLabel delegateMethod;
        public Form1()
        {
            InitializeComponent();
            //【4】绑定委托
            delegateMethod = SetLabel;
            Task.Run(new Action(()=> { ThreadMethod(); }));
        }
        //【3】定义执行方法
        public void SetLabel(Label label,string text,Color clr)
        {
            try
            {
                if (label.InvokeRequired)
                {
                    // label.Invoke(method, new object[] { label, text, clr });
                    this.Invoke(delegateMethod, new object[] { label, text, clr });
                }
                else
                {
                    label.Text = text;
                    label.BackColor = clr;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("SetLabel"+ex.Message);
            }
        }

        //定义线程方法
        public void ThreadMethod()
        {
            //【5】使用委托
            SetLabel(this.lblTest,"虎年大吉,万事如意!",Color.Green);
        }
    }
    //【1】声明委托类型
    public delegate void DelegateShowLabel(Label label,String msg,Color backColor);
 if (label.InvokeRequired)
                {
                    // label.Invoke(method, new object[] { label, text, clr });
                    this.Invoke(delegateMethod, new object[] { label, text, clr });
                }
                else
                {
                    label.Text = text;
                    label.BackColor = clr;
                }

这个方法是重点代码,笔者调试过。如果是跨线程访问控件,InvokeRequired为true,否则else

this.Invoke只是相当于授权执行SetLabel方法。执行完Invoke后InvokeRequired会变为false,这时候会通过delegateMethod再次调用SetLabel方法,就会执行else语句。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是使用C++语言实现多线程异步编程的代码示例: 多线程示例: ```cpp #include <iostream> #include <thread> // 线程函数,打印数字 void printNumbers() { for (int i = 1; i <= 10; ++i) { std::cout << i << std::endl; } } // 线程函数,打印字母 void printLetters() { for (char letter : {'a', 'b', 'c', 'd', 'e'}) { std::cout << letter << std::endl; } } int main() { // 创建两个线程 std::thread thread1(printNumbers); std::thread thread2(printLetters); // 等待两个线程执行完毕 thread1.join(); thread2.join(); std::cout << "Done!" << std::endl; return 0; } ``` 上述代码创建了两个线程,一个打印数字,一个打印字母。两个线程可以并行执行,提高了程序的性能。 异步编程示例: ```cpp #include <iostream> #include <string> #include <future> // 异步函数,获取网站HTML内容 std::string fetchWebsite(const std::string& url) { // 省略异步获取HTML内容的代码 return "HTML content"; } int main() { std::string url = "http://www.example.com"; // 异步获取网站HTML内容 std::future<std::string> futureHTML = std::async(std::launch::async, fetchWebsite, url); // 程序可以继续执行其他任务,不必等待HTML内容返回 std::cout << "Program continues..." << std::endl; // 等待HTML内容返回,并打印出来 std::string html = futureHTML.get(); std::cout << html << std::endl; return 0; } ``` 上述代码使用了C++11标准的异步编程特性,异步获取一个网站的HTML内容,并打印出来。异步编程可以提高程序的响应速度和并发性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值