同步委托和异步委托

异步委托怎么写

1.c#中异步委托怎样写

//创建委托对象HttpDownloadFileDel hdf = new HttpDownloadFileDel("与委托参数一致的方法名");hdf.BeginInvoke(“方法参数”, new AsyncCallback((f) =>{ while (!f.IsCompleted) { f.AsyncWaitHandle.WaitOne(200); } //你的逻辑,操作UI控件需要调度到UI线程。

//或者执行你的委托。 //fpd.Invoke(BasePath + "resource/" + fileName);}), "AsycState:OK");。

2.谁能简单明了的告诉我什么是异步,异步和委托有什么关系,还有就是

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace ConsoleApplication1

{

class Program

{

delegate void ZuoFanHandle();

static void Main(string[] args)

{

cZuoFan mZuoFan = new cZuoFan();

ZuoFanHandle ZuoFan = new ZuoFanHandle(mZuoFan.LaoPoZuoFan);

mZuoFan.FanShuLe += new cZuoFan.FanShuLeHandle(mZuoFan.ChiFan);

Console.Write("==================同步调用===================\r\n\r\n");

ZuoFan.Invoke();

Console.Write("我一直在看着老婆做饭,不用儿子叫,我也知道饭熟了\r\n\r\n");

Console.Write("==================异步调用===================\r\n\r\n");

ZuoFan.BeginInvoke(null, null);

Console.Write("老婆先去做吧,我看会电视,还可以干点别的,儿子叫我再吃饭\r\n");

Console.Read();

}

}

class cZuoFan

{

public delegate void FanShuLeHandle();

public event FanShuLeHandle FanShuLe;

public void LaoPoZuoFan()

{

Console.Write("老婆去做饭\r\n");

for (int i = 0; i <= 100; i = i + 10)

{

Console.Write(string.Format("老婆做饭完成了{0}%\r\n", i));

System.Threading.Thread.Sleep(500);

if (i == 100)

{

if (FanShuLe != null)

{

FanShuLe();

}

}

}

}

public void ChiFan()

{

Console.Write("饭熟了,儿子叫我吃饭了\r\n");

}

}

}

同步会等待结果的返回,就是 函数 调用完了,再接下去做事情,

异步 不会等待,提高CPU使用率

3.请问C#中的委托是什么

直接看MSDN或网上搜的大部分说的都是比较生硬的术语,你可以通俗的理解为将一个方法作为参数传递给另一个方法!也可以理解为:现有N个参数和返回值都相同的方法,在使用的时候根据需要一个个调用太繁琐,干脆把这些方法的规律(方法参数和返回值)总结出来,定义成一个委托!然后把要执行的方法交给委托去执行!+=操作实际上就是委托链,委托一次代理了若干个方法,以后执行时,我们调用委托来执行,委托会把所代理的方法一个个再执行!

委托在.net1.0就有,到了2.0时出现了匿名方法,也就是说委托要执行某一个方法,而这个方法并没有事先定义,随用随定义,连名字都没取,所以叫匿名方法。例:委托实例=delegate(int x,int y){return x+y;}实际就指向一个未取名的方法,而这个方法接收两个int参数,返回和。

到了.net3以后又更进一步,匿名方法还可以简写成:委托实例=(x,y)=>x+y; 这就是传说中的Lambda表达式,其本质是匿名方法,匿名方法本质是委托!

先通俗理解后,再看文档,你会恍然大悟!委托、匿名方法、Lambda表达式的概念其实很重要,如果你不理解的话是没办法学习好LinQ的。

这是我的理解,更多实例,你再搜吧~

4.C# Winform 多线程异步委托进度条

可以使用 BackgroundWorker 类进行操作。

写了一个demo程序可以参考一下,本例模拟从数据库获取 10000个学生的信息,用计算每个学生的总成绩和平均成绩作为耗时操作,显示进度条。主要代码:using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;namespace { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { } private void button1_Click(object sender, EventArgs e) { BackgroundWorker worker = new BackgroundWorker(); worker.WorkerReportsProgress = true; worker.DoWork += worker_DoWork; worker.RunWorkerCompleted += worker_RunWorkerCompleted; worker.ProgressChanged += worker_ProgressChanged; worker.RunWorkerAsync(); } private void worker_ProgressChanged(object sender, e) { // 设置进度条进度 progressBar1.Value = e.ProgressPercentage; } private void worker_RunWorkerCompleted(object sender, e) { // 取出学生信息,绑定时 DataGridView studentBindingSource.DataSource = e.Result; } private void worker_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker worker = sender as BackgroundWorker; List students = GetStudents(); // 模拟耗时操作,计算每个学生的总分数,平均分数 for (int i = 0; i < students.Count; i++) { students[i].Total = (students[i].Chinese + students[i].Math + students[i].English); students[i].Average = students[i].Total / 3; // 计算进度百分比 int percent = (i + 1) * 100 / students.Count; // 报告进度 worker.ReportProgress(percent); } // 将结果传给 BackgroundWorker e.Result = students; } ///

/// 模拟从数据库获取10000个学生信息 /// /// public List GetStudents() { List students = new List(); Random random = new Random(); for (int i = 0; i < 10000; i++) { students.Add(new Student { Name = "学生" + i, Chinese = random.Next(100), Math = random.Next(100), English = random.Next(100) }); } return students; } }}代码下载地址:.rar。

5.c# 通过异步委托的执行结果更新UI界面

已经加注释了,你看一下吧:

lblStatus.Text = "执行中,请稍候……";

FunclongTask = new Func(delegate()

{

// 模拟长时间任务

Thread.Sleep(2000);

// 返回任务结果:5

return 5;

});

// 发起一次异步调用,实际上就是在.net线程池中执行longTask

// 这时由于是其它线程在工作,UI线程未被阻塞,所以窗体不会假死

longTask.BeginInvoke(ar =>

{

// 使用EndInvoke获取到任务结果(5)

int result = longTask.EndInvoke(ar);

// 使用Control.Invoke方法将5显示到一个label上,如果没有Invoke,

// 直接写lblStatus.Text="5",将会抛出跨线程访问UI控件的异常

Invoke(new Action(() => lblStatus.Text = "执行结果是:" + result));

}, null);

6.C#

using System;

using System.Threading;

//使用委托调用异步例子

namespace

{

class AsyncDelegatesBlocked

{

public static int Add(int op1, int op2, out int result)

{

Thread.Sleep(3000); // Simulating work

return (result = op1 + op2);

}

public delegate int AddDelegate(int op1, int op2,

out int result);//声明AddDelegate委托

static void Main()

{

int result;

/*定义一个AddDelegate类型委托add,将方法Add绑定到委托实例上*/

AddDelegate add = new AddDelegate(Add);

Console.WriteLine("[Main] Invoking the asynchronous " +

"Add method");

/*BeginInvoke 方法用于启动异步调用。它与您需要异步执行的方法具有相同的参数,还有两个额外的参数

*BeginInvoke 立即返回,不等待异步调用完成。BeginInvoke 返回 IasyncResult,可用于监视调用进度。*/

//定义IAsyncResult接口类型实例iAR

//6, 42, out result为异步执行的方法的参数列表

IAsyncResult iAR = add.BeginInvoke(6, 42, out result,

null, null);

// Here we're simulating doing some work before

// blocking on the Add method's completion.

Console.Write("[Main] Doing other work");

for (int i = 0; i < 10; i++)

{

Thread.Sleep(200);

Console.Write(".");

}

Console.WriteLine(" [Main] Waiting for Add to finish");

/*使用 IAsyncResult.AsyncWaitHandle 获取 WaitHandle,

* 使用它的 WaitOne 方法将执行一直阻塞到发出 WaitHandle 信号,然后调用 EndInvoke。

* 注意:异步调用完成时会发出 WaitHandle 信号,可以通过WaitOne 来等待它*/

iAR.AsyncWaitHandle.WaitOne();

Console.WriteLine("[Main] Add finished, cleaning up");

/*EndInvoke 方法用于检索异步调用结果。调用 BeginInvoke 后可随时调用 EndInvoke 方法;

* 如果异步调用未完成,EndInvoke 将一直阻塞到异步调用完成。

* EndInvoke 的参数包括所需要异步执行的方法的 out 和 ref 参数以及由 BeginInvoke 返回的 IAsyncResult。*/

add.EndInvoke(out result, iAR);

Console.WriteLine("[Main] The result is {0}", result);

Console.ReadLine();

}

}

}

7.c# 线程的异步调用与同步调用

我这样写 是 异步调用呢? 还是同步调用???

同步异步是一个相对的概念, 相对于UI主线程来说, 当然是异步的, 所以这样调用不会造成UI界面假死;相对于你新开的线程来说, 这是一个同步的过程, 必须等这个Invoke执行完才能往下进行, 如果下面还有代码的话。

如果你想异步得更彻底些, 就用BeginInvoke

是不是在同一个时间点只能有一个子线程在运行???

如果是单核的CPU, 当然只能有一个线程运行, 目前的CPU大多是双核及以上, 所以会有同时运行两个线程的可能。

8.c#中断异步操作

using System; using System.Net; using System.Threading; using System.Text; using System.IO; //Request 类用于通过 //异步调用传递数据 public class RequestState { const int BUFFER_SIZE = 1024; public StringBuilder RequestData; public byte[] BufferRead; public HttpWebRequest Request; public Stream ResponseStream; //创建适当编码类型的解码器 public Decoder StreamDecode = Encoding.UTF8.GetDecoder(); public RequestState() { BufferRead=new byte[BUFFER_SIZE]; RequestData = new StringBuilder(""); Request = null; ResponseStream = null; } } //ClientGetAsync发出异步请求 class ClientGetAsync { public static ManualResetEvent allDone=new ManualResetEvent(false); const int BUFFER_SIZE = 1024; public static void Main(string[] args) { if (args.Length 0) { //准备Char 数组缓冲区,用于向Unicode转换 Char[] charBuffer = new Char[BUFFER_SIZE]; //将字节流转换为Char 数组,然后转换为字符串 //len显示多少字符被转换为Unicode int len = rs.StreamDecode.GetChars(rs.BufferRead, 0, read, charBuffer, 0); String str = new String(charBuffer, 0, len); rs.RequestData.Append(str); IAsyncResult ar = responseStream.BeginRead(rs.BufferRead, 0, BUFFER_SIZE, new AsyncCallback(ReadCallBack), rs); } else { if (rs.RequestData.Length > 1) { // 所有数据都已被读取,因此将其显示到控制台 string strContent; strContent = rs.RequestData.ToString(); Console.WriteLine(strContent); } //关闭响应流 responseStream.Close(); allDone.Set(); } return; } } 2. 判断控件的Handle是在当前线程中,则无需异步执行,否则要异步if (this.gcDC.InvokeRequired) { dlgt = new (OnLevelRegionChanged); this.Invoke(dlgt, new object[] { sender, ev }); } 3. 开启新线程可以通过开启新线程来执行异步操作,并给异步操作方法传递参数。

参数通常包括异步方法所需的所有数据。Thread thread=new Thread(new (GetDataFromWebService)); private static void GetDataFromWebService(object entity){ showWindow(); getData(); window.clost(); } 4.在界面线程外打开程序resultsCollection.AddRange(entity.DataCol); InsertIntoTable(resultsCollection, "", entity.tableName, entity.Schema, "", entity.IsNewFetch); if (window != null) { #region[Close progess window] System.Windows.Application.Current.Dispatcher.Invoke(new Action(() => { (window.WpfUIElement as System.Windows.Window).Close(); entity.SetNexValue(); })); #endregion }。

9.C#中的委托到底是什么概念

委托,简单理解是这样的.比如您要管您的孩子,把孩子送进了幼儿园.OK.此时您就把您的孩子委托给了幼儿园.当幼儿园放学,将孩子交还给您的手中.则是委托的回调.当然我这里的例子是说异步委托调用.您也可以同步.什么是同步委托调用?您去银行存钱.把钱给柜员.他们帮你点钞.存款然后给您存折或卡.那么您就相当于把钱委托给了柜员让他去执行存钱的这个函数.明白了么?Delegate delegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类。

与其它的类不同,delegate类能够拥有一个签名(signature),并且它"只能持有与它的签名相匹配的方法的引用"。它所实现的功能与C/C++中的函数指针十分相似。

它允许你传递一个类A的方法m给另一个类B的对象,使得类B的对象能够调用这个方法m。但与函数指针相比,delegate有许多函数委托和事件在 .Net Framework中的应用非常广泛指针不具备的优点。

首先,函数指针只能指向静态函数,而delegate既可以引用静态函数,又可以引用非静态成员函数。在引用非静态成员函数时,delegate不但保存了对此函数入口指针的引用,而且还保存了调用此函数的类实例的引用。

其次,与函数指针相比,delegate是面向对象、类型安全、可靠的受控(managed)对象。也就是说,runtime能够保证delegate指向一个有效的方法,你无须担心delegate会指向无效地址或者越界地址。

实现一个delegate是很简单的,通过以下3个步骤即可实现一个delegate:1. 声明一个delegate对象,它应当与你想要传递的方法具有相同的参数和返回值类型。2. 创建delegate对象,并"将你想要传递的函数作为参数传入"。

3. 在要实现异步调用的地方,通过上一步创建的对象来调用方法。using System; public class MyDelegateTest { // 步骤1,声明delegate对象 public delegate void MyDelegate(string name); // 这是我们欲传递的方法,它与MyDelegate具有相同的参数和返回值类型 public static void MyDelegateFunc(string name) { Console.WriteLine("Hello, ", name); } public static void Main() { // 步骤2,创建delegate对象(实例??) MyDelegate md = new MyDelegate(MyDelegateTest.MyDelegateFunc); // 步骤3,调用delegate md("sam1111"); } } 输出结果是:Hello, sam1111 了解了delegate,下面我们来看看,在C#中对事件是如何处理的。

C#中的事件处理实际上是一种具有特殊签名的delegate,象下面这个样子:public delegate void MyEventHandler(object sender, MyEventArgs e); 其中的两个参数,sender代表事件发送者,e是事件参数类。MyEventArgs类用来包含与事件相关的数据,所有的事件参数类都必须从System.EventArgs类派生。

当然,如果你的事件不含参数,那么可以直接用System.EventArgs类作为参数。就是这么简单,结合delegate的实现,我们可以将自定义事件的实现归结为以下几步:1.定义delegate对象类型,它有两个参数,第一个参数是事件发送者对象,第二个参数是事件参数类对象。

2.定义事件参数类,此类应当从System.EventArgs类派生。如果事件不带参数,这一步可以省略。

3.定义"事件处理方法,它应当与delegate对象具有相同的参数和返回值类型"。4.用event关键字定义事件对象,它同时也是一个delegate对象。

5.用+=操作符添加事件到事件队列中(-=操作符能够将事件从队列中删除)。6.在需要触发事件的地方用调用delegate的方式写事件触发方法。

一般来说,此方法应为protected访问限制,既不能以public方式调用,但可以被子类继承。名字是OnEventName。

7. 在适当的地方调用事件触发方法触发事件。下面是一个简单的例子:using System; public class EventTest { // 步骤1,定义delegate对象 public delegate void MyEventHandler(object sender, System.EventArgs e); // 步骤2(定义事件参数类)省略 public class MyEventCls { // 步骤3,定义事件处理方法,它与delegate对象具有相同的参数和返回值类型 public void MyEventFunc(object sender, System.EventArgs e) { Console.WriteLine("My event is ok!"); } } // 步骤4,用event关键字定义事件对象 private event MyEventHandler myevent; private MyEventCls myecls; public EventTest() { myecls = new MyEventCls(); // 步骤5,用+=操作符将事件添加到队列中 this.myevent += new MyEventHandler(myecls.MyEventFunc); } // 步骤6,以调用delegate的方式写事件触发函数 protected void OnMyEvent(System.EventArgs e) { if(myevent != null) myevent(this, e); } public void RaiseEvent() { EventArgs e = new EventArgs(); // 步骤7,触发事件 OnMyEvent(e); } public static void Main() { EventTest et = new EventTest(); Console.Write("Please input ''a'':"); string s = Console.ReadLine(); if(s == "a") { et.RaiseEvent(); } else { Console.WriteLine("Error"); } } } 输出结果如下,红色为用户的输入:Please input 'a': a My event is ok!。

异步委托怎么写

转载请注明出处育才学习网 » 同步委托和异步委托

知识

罗梅芬用日文怎么写(罗钰潇日语怎么写)

阅读(21421)

本文主要为您介绍罗梅芬用日文怎么写,内容包括伊蕾娜日语怎么写,王雪菲用日文怎么说,张佳怡在日语中怎么写啊怎么读啊。罗 ら ラ ra钰 ぎょく ギョク gyoku潇 しょう シヨウ shou第一列:日语汉字,写法同汉字,都要用繁体,这三个都挺难写的,看

知识

邓先生的英文怎么写(1~40的英文怎么说)

阅读(10436)

本文主要为您介绍邓先生的英文怎么写,内容包括“邓先生”用英语怎么写,1~40的英文怎么说,漂亮英文beautiful缩写怎么写。1 one 2 two 3 three 4 four 5 five 6 six 7 seven 8 eight 8 nine 10 te

知识

一个人布满皱纹怎么写(描写人物皱纹的句子)

阅读(9509)

本文主要为您介绍一个人布满皱纹怎么写,内容包括描写人物皱纹的句子,描写人物皱纹的句子,皱纹怎么描写。、老人脸上布满了皱纹,那一条条曲折不均的像是墙上斑驳的印迹,爬满了面容,留下了岁月的痕迹。2、外祖父是一位年过六旬的白发老人。在他

知识

登录接口怎么写(php登录的接口怎么写)

阅读(7755)

本文主要为您介绍登录接口怎么写,内容包括php登录的接口怎么写,网页登陆接口怎么做,网站登录接口程序怎么做。PHP 接口 接口 使用接口(interface),你可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。我们可以通过int

知识

档案奖惩情况怎么写(奖惩情况怎么写)

阅读(9596)

本文主要为您介绍档案奖惩情况怎么写,内容包括奖惩情况怎么写,个人简历及奖惩情况怎么填写,个人简历里面奖惩情况怎么写。在简历里的“奖励”部分,列出与你所获得的并与你的求职目标相关的荣誉、奖励和奖金。你既可以按时间顺序排列,也可以按

知识

头孢克肟拼音怎么写(头孢克肟的肟念什么)

阅读(7998)

本文主要为您介绍头孢克肟拼音怎么写,内容包括头孢克肟片全名拼音,头孢克肟片全名拼音,头孢克肟的肟念什么。肟[wò] :是含有羰基的醛、酮类化合物与羟胺作用而生成的有机化合物,可以参与许多有机化学反应,例如经典的Beckmann重排就是肟为底

知识

一库搜用日语怎么写(日语一库是什么意思)

阅读(7983)

本文主要为您介绍一库搜用日语怎么写,内容包括日语大神来,看动漫里的主人公说一句:恰,一库搜这是什么意思,一库一库;一搜库这两个日语是什么意思怎么写,看片都有“一库”(日语)是什么意。一库的意思就是“出发,出去”的意思。日语「行く」的音译

知识

外租无人机广告怎么写(植保无人机广告语)

阅读(6992)

本文主要为您介绍外租无人机广告怎么写,内容包括求一个无人机创意广告词谢谢巨友们了,求一关于无人机的广告标语,求一关于无人机的广告标语我们公司是做无人机的,新成立的公司,求。DJI大疆创新研发的的MG-1农业植保机专为农村作业环境设计,

知识

河南话que怎么写(河南话的nenna怎么写)

阅读(6527)

本文主要为您介绍河南话que怎么写,内容包括que怎么写,河南话的nenna怎么写,que怎么写。尿一壶(niào yī hú)关系密切,观点一致。例:“他俩今天尿一壶啦。”●尿(niào)⑴、从尿道排泄的液体。⑵、排泄小便。⑶、不放

知识

国学经文的论文怎么写(国学征文该怎么写)

阅读(7106)

本文主要为您介绍国学经文的论文怎么写,内容包括国学征文该怎么写,弟子规的400论文,关于国学经典的征文怎么写。“子曰:“温故而知新,可以为师”……小时,总是觉得国学就是没用的,古人写的话,我们还需要背,每次老师教给我们时,我总是会让思想开一

知识

化学实验总结怎么写(化学实验报告小结怎么写)

阅读(5391)

本文主要为您介绍化学实验总结怎么写,内容包括化学实验总结怎么写,化学实验报告小结怎么写,化学实验小结怎么写。化学实验报告的书写: 一般情况下化学实验报告是根据实验步骤和顺序从七方面展开来写的: 1.实验目的:即本次实验所要达到的目标或

知识

蝴蝶豌豆拼音怎么写(豌豆的拼音是什么)

阅读(5821)

本文主要为您介绍蝴蝶豌豆拼音怎么写,内容包括蝴蝶怎么拼音的,豌豆的拼音是什么,蝴蝶的拼音是什么。豌豆的拼音是[wān dòu]。豌豆是豆科一年生攀援草本,高0.5-2米。全株绿色,光滑无毛,被粉霜。叶具小叶4-6片,托叶心形,下缘具

知识

海绵宝宝用英文怎么说(海绵宝宝用英文怎么说)

阅读(6506)

本文主要为您介绍海绵宝宝用英文怎么说,内容包括海绵宝宝用英语怎么说,海绵宝宝用英文怎么说,海绵宝宝英文名是什么。1. SPONGEBOB SQUAREPANTS 近期很夯的一步卡通影片《海绵宝宝》(SpongeBob SquarePants)是一系

知识

茶盏怎么用(茶盏在茶道中干嘛用)

阅读(5417)

本文主要为您介绍茶盏怎么用,内容包括茶盏怎么用我要写一篇200字左右的茶盏的使用说明,求指教,茶盏在茶道中干嘛用,问一下斗笠盏如何使用现在是不是很少有人使用它,它的意义。苏东坡的名句"从来佳茗似佳人",典型地代表了唐宋及以后的文人墨客,

知识

thinkpad小红点怎么用(怎么学习使用thinkpad小红点)

阅读(7578)

本文主要为您介绍thinkpad小红点怎么用,内容包括怎么学习使用thinkpad小红点,thinkpad小红点怎么用,求教:THINKPAD的小红点使用方法。Thinkpad 小红点最高效的使用方法为:左手拇指按左键,无操作时在左键待命2、右手拇指按右键,同时兼按空格键及