关于invoke 的问题

spmzfz 2017-03-07 12:19:54
                this.Invoke(new Action(() => this.textBox1.Text = "Lucky day!"));
this.textBox1.Invoke( new Action (() => this.textBox1.Text = "a good day!") );


请问一下上面这两行代码可达到同样的效果,那 this.Invoke ()this.Control.Invoke()有什么区别么?它们可通用不?
...全文
241 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Poopaye 2017-03-13
  • 打赏
  • 举报
回复
Remarks里提到

The Invoke method searches up the control's parent chain until it finds a control or form that has a window handle if the current control's underlying window handle does not exist yet. If no appropriate handle can be found, the Invoke method will throw an exception. Exceptions that are raised during the call will be propagated back to the caller.

也就是说this.textBox1.Invoke最终还是会调用到this.Invoke(如果这里的this是form的话)
Poopaye 2017-03-13
  • 打赏
  • 举报
回复
引用
Executes the specified delegate on the thread that owns the control's underlying window handle.
由于对大多数人来说this和this.textBox1都运行在同一个线程上,所以这两句话没有区别(第二句多了一次.,反而效率低)
spmzfz 2017-03-13
  • 打赏
  • 举报
回复
this.Invoke(d, new object[] { text }); this.textBox1.Invoke(d, new object[] { text }); 它们在在语法上有什么区别么?
spmzfz 2017-03-13
  • 打赏
  • 举报
回复

        delegate void SetTextCallback(string text);

        private void ThreadProcSafe()
        {
            this.SetText("This text was set safely.");
        }

       delegate void DoSettext(string st);
        private void SetText(string text)
        {
            if (this.textBox1.InvokeRequired)
            {
                SetTextCallback d = new SetTextCallback(SetText);
                this.Invoke(d, new object[] { text });   
                //this.textBox1.Invoke(d, new object[] { text });
            }
            else
            {
                this.textBox1.Text = text;
            }


        }
        #endregion
        private void button1_Click(object sender, EventArgs e)
            {
            Thread t = new Thread(new ThreadStart(this.ThreadProcSafe));
            t.Start();
        }
这么说吧,上面编码中被注释掉的那行编码this.textBox1.Invoke()它和this.Invoke() 在语法上有什么区别么?
crystal_lz 2017-03-07
  • 打赏
  • 举报
回复
引用 3 楼 spmzfz 的回复:
THIS 不是指程序运行的界面窗口么?

但是 begin/Invoke 是来至于Control

Form最终也是继承于Control
而 Invoke 却在Control中诞生的

而在FindMarshalingControl函数中

没有仔细去跟 按照我的理解 他一直在不停的回退上一层的Parent 也就是最终会啊是会回退到Form这一层来 用Form来执行Invoke或者BeginInvoke
因为 其实UI线程本就就只有一个 虽然不同Control.Invoke 比如 你的TextBox按照理解是切换到TextBox的UI线程也就是住线程 立即执行此委托 但是住线程却只有一个 所以不管你是TextBox还是Button来Invoke最终都是主线程去执行 也就是上面看到的 他在不停的循环上层的Parent 最终回退到Form这个顶层容器上面 用Form的Invoke来执行
好吧以上是我自己看了反编译来YY的
spmzfz 2017-03-07
  • 打赏
  • 举报
回复
THIS 不是指程序运行的界面窗口么?
crystal_lz 2017-03-07
  • 打赏
  • 举报
回复
this 也是一个 控件 只不过这个控件有点风骚
spmzfz 2017-03-07
  • 打赏
  • 举报
回复
这是对 Windows 窗体控件进行线程安全调用 时使用invoke编码的。 LOOK HERE :对 Windows 窗体控件进行线程安全调用 但我不知道this.Invoke ()和 this.Control.Invoke()有什么区别么?
crystal_lz 2017-03-07
  • 打赏
  • 举报
回复
引用 5 楼 spmzfz 的回复:
//如果是跨线程调用 if (InvokeRequired){} 还有这里代码是从网上看到的,它InvokeRequired前面省略了具体的控件名称,这合规范么?
那就是this啊 this.InvokeRequired 反正我喜欢加上前缀
spmzfz 2017-03-07
  • 打赏
  • 举报
回复
//如果是跨线程调用 if (InvokeRequired){} 还有这里代码是从网上看到的,它InvokeRequired前面省略了具体的控件名称,这合规范么?

110,499

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧