美文网首页
OC转C#学习之Invoke与BeginInvoke

OC转C#学习之Invoke与BeginInvoke

作者: yayun_he | 来源:发表于2020-08-21 09:25 被阅读0次
Invoke:在拥有此控件的句柄窗口所在线程执行
BeginInvoke:在创建此空间的句柄窗口所在的线程上异步执行

简单点理解Invoke同步,BeginInvoke异步
(看半天,我就理解了就是个回主线程刷新UI?它不就是我们OC里dispatch_sync(dispatch_get_main_queue(), ),performSelectorOnMainThread,[[NSOperationQueue mainQueue] addOperationWithBlock:这玩意吗)
何为同步何为异步,想必大家都比较清楚了

直接demo说话吧
首先开辟了一个线程

            Thread t = new Thread(ThreadTest);
            t.Start();
            MessageBox.Show("main ID:" + Thread.CurrentThread.ManagedThreadId);

线程的执行方法

  private void ThreadTest()
        {
            MessageBox.Show("thread ID:" + Thread.CurrentThread.ManagedThreadId);

            Random r = new Random();
            Thread.Sleep(2000);
            // 可以理解成异步,不会阻塞当前线程,可以直接执行下面的messagebox。show方法
            // 如果是Invoke,会阻塞当前开辟的线程,等执行结束才会show

            BeginInvoke(new Action(() =>
                {
                    // 回主线程刷新UI
                    
                    Thread.Sleep(3000);// 睡3秒阻塞主线程,无论同步还是异步这个时候这3秒都会则塞主线程,因为已经回到主线程了
                    this.txtData.AppendText(r.Next(10, 100).ToString());
                }));
            
            //Thread.Sleep(10);
            MessageBox.Show("========");
        }

运行可知道,test方法与show mainID他们执行不分前后,因为一个是主线程一个是子线程嘛
意义不大,聊重点

  • 如果使用Invoke也就是说同步嘛,当执行线程ThreadTest方法时先睡2秒,然后进入Invoke回到主线程在睡3秒,再去刷新UI,刷新完才会去执行MessageBox.Show("========");
  • 如果使用BeginInvoke异步,区别就是,在子线程ThreadTest方法中睡完2秒直接就执行BeginInvoke,在执行MessageBox.Show("========");此时他不会等到BeginInvoke内部执行完以后再去执行MessageBox.Show("========");

在者还有会有BeginInvoke执行结束回调,大家可自行研究测试BeginInvoke() AsyncCallback作为它的参数,可以实现回调方法。

如理解有误还望大家指点,谢谢

相关文章

网友评论

      本文标题:OC转C#学习之Invoke与BeginInvoke

      本文链接:https://www.haomeiwen.com/subject/psnyjktx.html