C#使用异步委托在另一个线程上更新窗体不能省略可选参数

使用button1更新label1:

        private delegate void UpdateFormInvoke(string a, string b = "B");
        private void UpdateForm(string a, string b = "B")
        {
            label1.Text = a + " - " + b;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Thread th = new Thread(Test);
            th.Start();
        }

        void Test()
        {
            UpdateFormInvoke uli = new UpdateFormInvoke(UpdateForm);
            this.BeginInvoke(uli, new object[] { "A" });
        }

参数计数不匹配异常:

修改代码1:

        private delegate void UpdateFormInvoke(string a, string b = "B");
        private void UpdateForm(string a, string b)
        {
            label1.Text = a + " - " + b;
        }

修改代码2:

        private delegate void UpdateFormInvoke(string a, string b);
        private void UpdateForm(string a, string b = "B")
        {
            label1.Text = a + " - " + b;
        }

结果出现相同的错误

修改代码3:

        void Test()
        {
            UpdateFormInvoke uli = new UpdateFormInvoke(UpdateForm);
            this.BeginInvoke(uli, new object[] { "A", "B" });
        }

不省略可选参数,无异常。

原文地址:https://www.cnblogs.com/x2009/p/8496332.html

时间: 2024-10-31 22:23:01

C#使用异步委托在另一个线程上更新窗体不能省略可选参数的相关文章

C#在某个线程上创建的控件不能成为在另一个线程上创建的控件的父级

首先在form1的窗体载入中新建了一个Class1对象并将本身的引用传递进入其构造函数,然后在Class1的构造函数中创建一个线程.该线程所代理的方法事件是本类中的一个add方法.而add方法的内容则是在form1上放一个textbox.然而这个流程你需要注意的有几个问题:1.哪个是主线程?所谓主线程是第一个启动的线程,是从main开始的.form1的这个窗体是由主线程创建的.2.Thread t的线程是什么?t是由主线程创建的,t的操作内容是在由主线程创建的窗体上放一个textbox.也就是说

使用Condition Variables 实现一个线程安全队列

使用Condition Variables实现一个线程安全队列 多线程代码需要面对的一个问题和是如何把数据从一个县城传到另一个县城. 举个栗子,一个常见的是把串行算法并行化方法是,把他们分成块并且做成一个管道.管道中任意一块都可以单独在一个线程里运行.每个阶段完成后添加数据到输入队列给下个阶段. Basic Thread Safety with a Mutex 使用mutex实现简单的线程安全 最简单的办法是封装一个非线程安全的队列,使用mutex保护它(实例使用boost中的方法和类型,需要1

Android新线程中更新主线程中的UI控件

Android中的View都不是线程安全的,所以如果在某一个新线程中直接更新主线程中的UI控件时就会报如下错误: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 为了解决在另一个线程中更新UI控件的问题,我们可以使用如下几种解决方案: 1. 自己写Handler解决,参见<And

Jmeter在一次线程里多次调用同一个拼接参数,不使用自带拼接函数

记录一下使用Jmeter在一次线程里需要多次调用同一个参数时的拼接方法 在对创建.编辑等接口使用Jmeter进行性能.稳定性测试时,需要造多个名称相同,编号不同的参数. 例如:productName参数,对应字段分别为testCreate001.testCreate002.testCreate003…… 原先是使用用户参数+计数器组件,加上Jmeter自带的__V{}函数,像这样: 这种方法在我没有将productName的字段testCreate参数化的时候很好用 ,无论怎么调用,在运行一次线

C#基础之--线程、任务和同步:一、异步委托

创建线程的一种简单方式是定义一个委托,并异步调用它.委托是方法的类型安全的引用. Delegate还支持异步地调用方法.在后台Delegate类会创建一个执行任务的线程. 为了说明委托的异步特性,从一个需要一定的时间才能执行完毕的方法开始. TakesAWhile方法至少需要经过第2个变量传递的毫秒数才能执行完,因 为它调用了Thread.Sleep()方法. static int TakesAWhile(int data, int ms) { Console.WriteLine("TakesA

使用异步委托执行线程(delegate)

由于异步委托产生的线程与应用程序主线程是分开执行的,若主线程要获取异步委托线程的结果,则主线程需要等待异步委托的执行结果. BeginInvoke是Delegate类型的一个方法,它的返回类型为IAsyncResult,通过该接口,可以获得异步委托的执行信息. 1.投票技术:等待异步委托结果的一种方法是投票技术,该技术的实现原理是通过IAsyncResult接口的IsComplete属性来检查委托是否完成了任务.EndInvote方法获取执行结果.举个例子,如下: 执行后的效果: 2.访问等待句

创建线程之异步委托

首先定义一个runtaketime委托: public delegate int runtaketime(int data,int ms); 定义一个静态的方法,参数,返回类型和定义的委托一样 static public int taketime(int data, int ms) { Console.WriteLine("time begin!"); Thread.Sleep(ms); Console.WriteLine("time end!"); return

01-多线程及异步委托

一.多线程: 1.概念: 线程:是Windows任务调度的最小单位.线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针.程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数. 多线程:是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务(代码),也就是说允许单个程序创建多个并行执行的线程来完成各自的任务. 2.为什么要用多线程: ①让计算机"同时"做多件事情,节约时间. ②多线程可以让一个程序“同时”处理多个事情. ③后台运行程序,

BeginInvoke 方法真的是新开一个线程进行异步调用吗?

转自原文BeginInvoke 方法真的是新开一个线程进行异步调用吗? 参考以下代码: public delegate void treeinvoke(); private void UpdateTreeView() { MessageBox.Show(System.Threading.Thread.CurrentThread.Name); } private void button1_Click(object sender, System.EventArgs e) { System.Threa