首页
学习
活动
专区
圈层
工具
发布

跨线程调用窗体控件

不过Windows 窗体体系结构对线程使用制定了严格的规则。如果只是编写单线程应用程序,则没必要知道这些规则,这是因为单线程的代码不可能违反这些规则。...然而,一旦采用多线程,就需要理解 Windows 窗体中最重要的一条线程规则:除了极少数的例外情况,否则都不要在它的创建线程以外的线程中使用控件的任何成员。...实际中,大部分 Windows 窗体应用程序最终都只有一个线程,所有 UI 活动都发生在这个线程上。这个线程通常称为 UI 线程。...这意味着辅助线程代码不再担心需要过多关注 UI 细节,而只要定期调用 ShowProgress 即可。 如果我提供一个设计为可从任何线程调用的公共方法,则完全有可能某人会从 UI 线程调用这个方法。...在这种情况下,没必要调用 BeginInvoke,因为我已经处于正确的线程中。调用 Invoke 完全是浪费时间和资源,不如直接调用适当的方法。

1.6K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    如何在多线程中调用winform窗体控件

    由于 Windows 窗体控件本质上不是线程安全的。因此如果有两个或多个线程适度操作某一控件的状态(set value),则可能会迫使该控件进入一种不一致的状态。...于是在调试器中运行应用程序时,如果创建某控件的线程之外的其他线程试图调用该控件,则调试器会引发一个 InvalidOperationException  本文用一个很简单的示例来讲解这个问题(在窗体上放一个...              {                 _TextBox.Text = _Value;             }         }     } } 解决办法二:通过委托安全调用...SetTextBoxValue();         }                         private delegate void CallSetTextValue();         //通过委托调用

    3.1K100

    reactjs开发自制编程语言编译器:实现变量绑定和函数调用

    实现函数调用 当我们完成函数调用功能后,我们的编译器就能执行如下代码: let addThree = fn(x){return x+3;} addThree(3) 上面代码被编译器执行后,add函数调用会返回结果...,接着调用evalExpressions函数解释执行参数表达式,从而获得最后要传入函数的结果,也就是evalExpressions会将”2+2”,”5+5”解释执行,得到结果4和10,这两个值将会作为调用参数...从输出看,我们的编译器能够识别”add(2+2,5+5)”是函数调用,同时它把参数表达式“2+2”和”5+5“解释执行后得到4和10,并把这两个值作为函数的真正调用参数。...,在函数调用前代码执行对应一个Enviroment对象,当函数调用后,在执行函数体内的语句时对应一个新的Enviroment对象,后者用outer指针跟前者关联起来,outer就如上图两个方块间连接起来的箭头...至此我们的编译器就具备了变量绑定功能和函数的调用执行功能。

    1.1K30

    c#在当前窗体的按钮事件调用另一封…

    关键是事件参数的问题; 因为进入一个事件,那么事件的两个参数是代表响应事件的按钮,你现在 指定调用另一个按钮的事件,那么这个事件的参数就不是那个按钮了,而是第一个按钮。...至于调用公共代码都好解决。...因为按钮的事件中要传递object sender, EventArgs e 这两个参数,好象没法直接调用, 第一种解决方法:建议你把事件处理代码写成一个的方法(不过要确保你在这个方法中没有用到sender...和e),这样在每个按钮事件中都可以调用了....第二中解决方法:当前窗体的按钮事件设置窗体结果及this.DialogResult=System.Windows.Forms.DialogResult.OK或者其他的结果,在另一个窗体那里接受结果,进行判断

    1.4K20

    40道ReactJS 面试问题及答案

    无论你是希望提高技能的经验丰富的开发人员,还是准备即将到来的 ReactJS 面试的求职者,本指南都将为 ReactJS 开发中的关键概念和最佳实践提供宝贵的见解。...ReactJS 是一个功能强大的 JavaScript 库,用于使用构建块创建交互式用户界面。 ReactJS 的运行原理是声明式和基于组件的方法。...如何进行 AJAX 调用以及应该在哪些组件生命周期方法中进行 AJAX 调用?...随着 ReactJS 应用程序复杂性和用户群的增长,扩展 ReactJS 应用程序需要优化其性能、可维护性和可扩展性。...如何构建 ReactJS 应用程序? 构建 ReactJS 应用程序涉及设计结构和组织组件、状态管理、路由、数据获取以及应用程序的其他方面,以实现可维护性、可扩展性和性能。

    8.6K10

    reactjs自制Monkey语言编译器:解析组合表达式,ifelse语句块和间套函数调用

    ,当解析器解读到token 的类型为true或false时,就直接调用parseBoolean函数进行解析。...== true) { return null } return exp } 一旦解析到左括号”(“时,编译器立马调用上面函数,它通过调用parseExpression...最后,我们再看看函数调用如何实现,在Monkey语言中,函数调用有多种方式,例如: add(2, 3+(1*4)); fn (x,y) { let z = x + y; return z;...函数调用的模式是,前面一个表达式也就是函数名或函数体实现,后面跟着一个左括号,然后是传入参数,因此函数调用解析的触发,必须放在后序调用表中: registerInfixMap() { .......,调用相应的解析函数进行解析,如果变量名或函数定义之后跟着一个左括号的话,那么解析器就知道它当前遇到了一个函数调用,于是就从上面的后序调用表中,根据左括号查找到解析函数parseCallExpression

    65230

    ReactJs开发自制Monkey语言编译器:实现内嵌函数调用以及增加数组类型

    几乎所有编程语言都会支持内嵌API调用,这些调用会根据操作系统特点,执行相关的系统调用进而实现一系列功能,例如C语言中支持的printf就是内嵌API,它能帮开发者将信息输入到控制台中,本节将为我们的Monkey...return obj } } return this.newError("unknown function call") } 一旦有函数调用时...然后我们在解析器解析执行函数时,调用上面代码: eval (node) { var props = {} switch (node.type) { ......当解析器执行函数调用时,如果对应的函数名没有在环境变量对应的符号表中找到,那它会调用buildin函数,将函数名传入,看看对应函数是否属于内嵌函数,如果是,那么就直执行内嵌函数的逻辑,并把结果返回。...,如果没有遇到’]’,那表示解析还未结束,继续调用parseExpression来解析后面的数组元素,直到遇到’]’为止。

    59020

    .NET混合开发解决方案12 网页JS调用C#方法访问WinForm或WPF窗体

    JS方法 .NET混合开发解决方案11 网页JS调用C#方法   在前一篇博客《.NET混合开发解决方案11 网页JS调用C#方法》中介绍了JS访问C#方法的简单实现方式。...但是在企业级应用软件中业务需求可能更加复杂,如JS调用C#方法之后,需要访问宿主的窗体,设置窗体(WinForm、WPF、WinUI、Win32)中的控件等。...下面通过一个Demo来讲解如何实现JS调用C#方法。 业务场景:JS调用C#方法,传递三个参数,分别是num1、num2、message。...C#接收到参数后,调用WinFrom窗体中定义的方法,将num1与num2作为参数传入,并将计算结果显示在窗体控件上。 先看一下示例效果 下面详细介绍其实现步骤。...使用主机对象调用C#方法,由于调用过程是异步的,所以需要使用 await,方法定义前需要加上 async。 以上四步完成后即实现了JS访问窗体方法。

    3K40

    Excel催化剂开源第8波-VSTO开发之异步调用方法

    在VSTO开发过程中,因其和普通的Winform开发有点差别,具体细节笔者也说不清楚,大概是VSTO的插件是寄生在Excel中,不属于独立的进程之类的,其异步方法调用时,未能如Winform那样直接用await...使用场景 在Excel上直接使用异步方法,貌似有上述提及的问题,不像Winform程序那样,需要Excel上调出窗体,再从窗体上作异步方法的操作,直接调用的话,遇到用户用键盘、鼠标交互Excel操作会报错...await webClient.DownloadFileTaskAsync(uri, dstFilePath); //线程间操作无效: 从不是创建控件的线程访问它...//线程间操作无效: 从不是创建控件的线程访问它。...Action actionColseForm = () => { this.Close(); }; Invoke(actionColseForm); 结语 异步方法调用这东西,

    88620

    invoke和begininvoke 区别——c#

    解决从不是创建控件的线程访问它 在多线程编程中,我们经常要在工作线程中去更新界面显示,而在多线程中直接调用界面控件的方法是错误的做法,Invoke 和 BeginInvoke 就是为了解决这个问题而出现的...如果直接设置程序必 定会报出:从不是创建控件的线程访问它,这个异常。通常我们可以采用两种方法来解决。一是通过设置control的属性。...这个主线程维护着整个窗体以及上面的子控件。当它得到一个消息,就会调用DispatchMessage方法派遣消息,这会引起对窗体上的窗口过程的调用。...例如,我们调用窗体上一个进度条的Invoke方法封送委托,但是实际上会回溯到主窗体,通过这个控件对象来封送委托。因为主窗体是主线程消息队列相关的,发送给主窗体的消息才能发送到界面主线程消息队列。...= currentThreadId); } } } 终于看到了,这是在判断windows窗体线程和当前的调用者线程是否是同一个,如果是同一个就没有必要封送了,直接访问这个GUI控件吧

    4.2K41
    领券