delegate

Control.BeginInvoke()和delegate的BeginInvoke()的区别

匿名 (未验证) 提交于 2019-12-03 00:14:01
最近在一个demo中了解到可以用BeginInvoke来处理异步,于是我也自己做了一个winform来学习BeginInvoke。 在窗体上放置了一个按钮和一个label,点击按钮3秒后再label上显示“Hello World”。先是有了如下代码: 1 private void btnStart_Click(object sender, EventArgs e) 2 { 3 BeginInvoke(new xDel(k => 4 { 5 Thread.Sleep(k); 6 txtMain.Text = "Hello World"; 7 }), 3000); 8 } 9 10 delegate void xDel(int i); 点击按钮后调用BeginInvoke执行异步,传递一个委托。按照我的设想,应该BeginInvoke应该是创建一个新线程执行委托,所以不会造成UI假死。 但是结果是运行后UI还是假死了。 后来上网查找了一些资料才发现,原先看的demo里使用的委托的BeginInvoke方法,而我写的BeginInvoke是属于Control类的。正确的写法应该是: 1 private void btnStart_Click(object sender, EventArgs e) 2 { 3 xDel xd = new xDel(t => 4 { 5 Thread

C#跨线程时使用Delegate委托

匿名 (未验证) 提交于 2019-12-03 00:05:01
当C#程序使用到多线程时,不同进程间不能相互调用,可使用委托来处理; 以下需求案例为: Winform程序中有一个进度条和一个后台backgroundworkder,当后台进程完成每一个阶段时更新窗体中的进度条信息。 //在backgroundwork中变更ProcessBar的值 private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { // do something UpdateProcessBarAdd1(); } //创建委托 private delegate void UpdateProcessBarAdd1_Delegate(); private void UpdateProcessBarAdd1() { //此处采用递归的简写方法 if (progressBar1.InvokeRequired) { UpdateProcessBarAdd1_Delegate mDelegate = new UpdateProcessBarAdd1_Delegate(UpdateProcessBarAdd1); progressBar1.Invoke(mDelegate); //若需要传入参数,请参照如下: //progressBar1.Invoke(mDelegate,new object[]

代理

匿名 (未验证) 提交于 2019-12-02 23:55:01
静态代理 public interface Subject { void dealTask ( String taskName ); } public class RealSubject implements Subject { @Override public void dealTask ( String taskName ) { System . out . println ( "Running Task:" + taskName ); try { TimeUnit . MILLISECONDS . sleep ( 1000 ); } catch ( InterruptedException e ) { e . printStackTrace (); } } } public class ProxySubject implements Subject { private Subject delegate ; public ProxySubject ( Subject delegate ) { this . delegate = delegate ; } @Override public void dealTask ( String taskName ) { long startTime = System . currentTimeMillis (); delegate .

C#中this.Invoke()中委托的定义

匿名 (未验证) 提交于 2019-12-02 23:52:01
1、定义一个线程 Thread thread = new Thread(()=> { if(this.IsHandleCreated) //判断线程是否创建完成 // 以下为委托的几种写法 1、 this.Invoke( (MethodInvoker)(()=> { …方法体…})); 2、 this.Invoke( (MethodInvoker) delegate{…方法体…}); 3、this.Invoke( new MethodInvoker (()=> { …方法体…})); 4、 this.Invoke( new MethodInvoker (delegate{…方法体…})); } ) {IsBackground = true(主线程执行完,该线程自动关闭)}.Start(); 转载请标明出处: C#中this.Invoke()中委托的定义 文章来源: https://blog.csdn.net/thanks_hck/article/details/97273977

.NET 委托(Delegate、Action、Func)

匿名 (未验证) 提交于 2019-12-02 23:43:01
Delegate protected delegate int ClassDelegate(int x, int y);//定义委托类型及参数 static void Main(string[] args) { ClassDelegate dele = new ClassDelegate(Add);//实例化一个委托 Console.WriteLine(dele(1, 2));//调用委托 Console.ReadKey(); } static int Add(int a, int b) { return a + b; } Action,可以传入参数,没有返回值的委托 方法1,调用方法      static void Main(string[] args) { Action<int, int> ac = new Action<int, int>(ShowAddResult);//实例化一个委托 ac(1, 2);//调用委托 Console.ReadKey(); } static void ShowAddResult(int a, int b) { Console.WriteLine(a + b); } 方法2,使用lambda表达式 static void Main(string[] args) { Action<int, int> ac = ((p, q) =>

C#委托(delegate、Action、Func、predicate)和事件

匿名 (未验证) 提交于 2019-12-02 22:09:29
一、前言 刚开始工作的时候,觉得委托和事件有些神秘,而当你理解他们之后,也觉得好像没有想象中的那么难。在项目中运用委托和事件,你会发现他非常棒,这篇博文算是自己对委托和事件的一次梳理和总结。 二、委托 C#中的委托,相当于C++中的指针函数,但委托是面向对象的,是安全的,是一个特殊的类,当然他也是引用类型,委托传递的是对方法的引用。 2.1、delegate 声明委托就必须使用关键字“delegate”,委托是先声明,后实例化。至少0个参数,至多32个参数 格式如下所示: private delegate string GetAsString (); 委托是一个类,所以他的实例化跟类的实例化一样,只是他总是接受一个将委托方法作为参数的构造函数。调用委托方法就有两种方式,如下所示: int i = 10 ; var method = new GetAsString ( i . ToString ); //调用方法一 Console . WriteLine ( $ "method方法{method()}" ); //调用方法二 Console . WriteLine ( $ "method.Invoke方法{method.Invoke()}" ); 运行结果: 2.2、Action Action是无返回值的泛型委托,可以接受0个至16个传入参数 Action 表示无参,无返回值的委托

.Net委托

匿名 (未验证) 提交于 2019-12-02 22:06:11
委托声明 委托是一种可以指向方法的数据类型。 比如delegate void MyDelgate(int n); 委托实例 class Program { delegate void MyDel(string name);//声明委托 static void Main(string[] args) { //委托将要指向的方法必须的参数个数、类型和返回值类型都必须要与委托声明的一样 MyDel myDel = new MyDel(SayHello);//这里不要写成SayHello() myDel("蛋蛋");//输出"蛋蛋你好" myDel = null; myDel("蛋蛋");//会抛出空引用异常 Console.ReadKey(); } static void SayHello(string name) { Console.WriteLine(name + "你好!"); } } } MyDelgate myDel = new MyDelgate(方法名); 也可以写成简化形式: MyDelgate myDel = 方法名; //编译器会自动搞成new Mydel (SayHello);注意方法名不能带括号 在写一个例子,获取一个数组中最大值;由于类型不定,所以最大值的算法也不一样,可以使用委托把最大算法稳定下来,把比较规则通过委托进行开放。 class Program {

C#委托学习笔记

你。 提交于 2019-12-02 21:27:10
1、C#委托是什么 c#中的委托可以理解一种类,这种类实例化后可以将函数的包装成一个变量(该变量就变成了对该函数的“引用”),它使得这个变量(函数)可以作为参数来被传递 ,这在作用上相当于c 中的函数指针。c 用函数指针获取函数的入口地址,然后通过这个指针来实现对函数的操作。 委托的定义和方法的定义类似,只是在定义的前面多了一个delegate关键字。如下定义: public delegate void MyDelegate(int para1, string para2); 委托能包装的方法是有一定限制的,例如能被前面的委托类型MyDelegate包装的方法需要满足以下条件: 1.方法的返回类型必须为void; 2.方法必须有两个参数,并且第一个参数应为int类型,第二个参数为string类型。 总结:可以被委托包装的方法必须满足以下规则: 1.方法的签名必须与委托一致,方法签名包括参数的个数、类型和顺序; 2.方法的返回类型要和委托一致,注意,方法的返回类型不属于方法签名的一部分。 2、委托的使用 //委托使用的演示 class Program { public delegate void MyDelegate(int para1, int para2); //1.使用delegate关键字来定义一个委托类型 static void Main(string[] args) {

linq

流过昼夜 提交于 2019-12-02 19:00:30
2018年10月24日 周三 13:30 linq深入.rtf 2018年10月8日 周一 13:28 linq深入 一、匿名类:[ C# 3.0/.NET 3.x 新增特性 ] 1.1 不好意思,我匿了    在开发中,我们有时会像下面的代码一样声明一个匿名类:可以看出,在匿名类的语法中并没有为其命名,而是直接的一个 new { } 就完事了。从外部看来,我们根本无法知道这个类是干神马的,也不知道它有何作用。 var annoyCla1 = new { ID = 10010, Name = "EdisonChou", Age = 25 }; Console.WriteLine("ID:{0}-Name:{1}-Age:{2}", annoyCla1.ID,annoyCla1.Name, annoyCla1.Age);   经过调试运行,我们发现匿名类完全可以实现具名类的效果: 1.2 深入匿名类背后    既然我们发现匿名类可以完全实现具名类的效果,那么我们可以大胆猜测编译器肯定在内部帮我们生成了一个类似具名类的class,于是,我们还是借助反编译工具对其进行探索。通过 Reflector 反编译,我们找到了编译器生成的匿名类如下图所示:   从上图可以看出:   (1)匿名类被编译后会生成一个 [泛型类] ,可以看到上图中的<>f__AnonymousType0<<ID>j_

QML Listveiw delegate( item ) 不同高度,引起 contentY 不确定问题解决方案

风格不统一 提交于 2019-12-02 11:10:31
在 QML 开发中 Listview 是经常用的控件,作用过程中发现一个 bug 当每个 delegate 的高度不等的时候,在上下滑动过程中会引起contentY 的变动, 上下来加多滑动几次,加到顶部后 contentY 不再是原来的值了(默认为 0),这时候如果要通过 contentY 做类似下拉刷新的效果就会出问题了。Qt 官方 bug list 说暂时不处理了 https://bugreports.qt.io/browse/QTBUG-31573 经过大量测试,发现 originY 也会随着 contentY 的变化面变化, 最后确认做类似下拉刷新的效果时所有用到 contentY 的地方都用 (contentY - originY)替换就可以了,在Qt 提供的example// qtdeclarative/examples/quick/demos/tweetsearch, 验证过,确实可行,是一种解决办法,现将验证部分代码粘贴如下,提供给各位同学参考,希望同学们斧正: // qrc:/demos/tweetsearch/tweetsearch.qml // part code ListView { id: mainListView anchors.fill: parent // delegate: TweetDelegate { } // model: