异步委托怎么写

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!。

异步委托怎么写

转载请注明出处育才学习网 » 异步委托怎么写

知识

小孩的诵读评语怎么写

阅读(240)

本文主要为您介绍小孩的诵读评语怎么写,内容包括小孩读书评语怎么写,家长对孩子读书的评价怎么写,家长对孩子的读书评语怎么写。“孩子,你辛苦了!”我知道你一直很努力地去干每一件事。虽然还没有一个同学为你的成绩喝彩过,但老师却一直在关注

知识

三年级自我反思怎么写

阅读(297)

本文主要为您介绍三年级自我反思怎么写,内容包括小学生三年级作文自我反思怎么写,小学三年级学生反思如何写,小学三年级自我评价怎么写。凡事过犹不及。没错,这些天,我一直在反思着。缘于一个朋友的一个词儿:黔驴技穷。因为没有写东西,而只是弄

知识

三开门衣柜怎么写设计说明书

阅读(218)

本文主要为您介绍三开门衣柜怎么写设计说明书,内容包括三开门挂衣柜如何设计,家具衣柜设计说明书,如何写家具设计说明。折叠门和平开门设计,这类开门衣柜的开启空间大,一目了然,相对于移门来说,折叠门和平开门的封闭性要好。不过,折叠门和平开门

知识

英语贺卡的英文怎么写

阅读(281)

本文主要为您介绍英语贺卡的英文怎么写,内容包括写贺卡英语怎么说,英语贺卡怎么写,英语贺卡应该写些什么用英文写..。格式如下:受贺人称呼(如Dear ***):***********贺词Yours sincerely******(自己名字)贺词通常写一

知识

音乐教室怎么读怎么写

阅读(209)

本文主要为您介绍音乐教室怎么读怎么写,内容包括音乐教室怎么读,音乐教室怎么读,英语音乐教室怎么读。右脑开发,刻不容缓!多彩人生,音乐作伴!二、为您修炼琴键上灵动的十指,帮您打造舞台上非凡的歌喉。三、爱乐人的家某某音乐教室以上共三条,如

知识

写钢笔字用英语怎么写

阅读(253)

本文主要为您介绍写钢笔字用英语怎么写,内容包括“用钢笔写”英语怎么说,钢笔用英语怎么读用汉字写,写字用英语怎么说。write英 [raɪt] 美 [raɪt] vi. 写,

知识

项目人员调整说明怎么写

阅读(272)

本文主要为您介绍项目人员调整说明怎么写,内容包括工程变更情况说明怎么写,公司人员调动通知怎么写,岗位调整证明怎么写。关于公司人事变动的通知各部门: 因公司战略发展需要,经公司董事会研究,决定对以下人员工作岗位进行变动调整:1. 原XXXX部

知识

表演用英文怎么写

阅读(330)

本文主要为您介绍表演用英文怎么写,内容包括学表演用英语怎么写,上表演课用英语怎么写,“表演英语短剧”用英文怎么说。“上表演课”有很多的说法,要看你在什么情况下说。虽然“表演”就是acting/performance 或者是drama,“课”可以用cl

知识

穿梭作文的开头怎么写

阅读(227)

本文主要为您介绍穿梭作文的开头怎么写,内容包括如何写穿越小说的开头和结尾(最好举个例子)谢谢,巧遇的作文开头怎么写,作文开头怎么写。着重写出写出穿越前后的心里描写。以下是从互联网上搜索出来的总结:穿越小说的写作要求首先一定要穿越。

知识

航空器用英语怎么写的

阅读(267)

本文主要为您介绍航空器用英语怎么写的,内容包括飞机用英语怎么写,飞机用英语怎么写,飞机用英语怎么写呀。飞机的英语单词是plane。词汇分析音标:英 [pleɪn] 美 [plen]释义:n. 飞机;平面;程度,水平vi. 刨;乘飞机旅行;

知识

三亚旅行游记怎么写

阅读(270)

本文主要为您介绍三亚旅行游记怎么写,内容包括写一篇关于三亚景点的游记,去三亚写游记,三亚游记作文399字左右。到了海南岛,必然要去三亚。 游三亚,不游“天涯海角”和“鹿回头”,枉为游也! 在我看来,海南的许多景点都没有“天涯海角”“鹿

知识

conferencepaper怎么写

阅读(241)

本文主要为您介绍conferencepaper怎么写,内容包括conferencepaper是什么意思,conferencepaper和conferenceprocceeding什么区别,计算机国际会议中proceedings,conference,paper,workshop,demo的都。conference paper和conference procceedi

知识

dang务事的dang怎么写

阅读(234)

本文主要为您介绍dang务事的dang怎么写,内容包括同学对我的评价怎么写,dangwu怎么写,衣裳、铃铛、端庄、静谧、屋檐、凄冷拼音怎么写。你为人热情,性格开朗,亦能说会道。对待学习态度端正,上课能够专心听讲,课下能够认真完成作业。不用去想能攀

知识

dnf设计图ct怎么写

阅读(402)

本文主要为您介绍dnf设计图ct怎么写,内容包括DNF游戏里提示辅助说明的CT怎么做,dnf用ct是怎么做的,dnf怎么制作满技能ct。基本就是公式武器冰冻公式(叫做写法也可以)虫巨烧血设计图召唤 怪/人偶属性微调(三速无CDBUFF之类的)消耗品召唤消耗品技

知识

代办迁移证委托授权书怎么写

阅读(227)

本文主要为您介绍代办迁移证委托授权书怎么写,内容包括代办户口迁移证委托书怎么写,代办户口迁移委托书怎么写,户口迁移证委托书该怎么写。委 托 书委托人:张三,女,一九八五年十一月十一日出生,现住******,公民身份号码:******。受托人:李四,男,一九

知识

授权委托书怎么写的正确方法

阅读(320)

本文主要为您介绍授权委托书怎么写的正确方法,内容包括委托书怎么写的正确方法,委托书怎么写的正确方法,委托书怎么写的正确方法。首先要写委托人的姓名,性别及有效身份证号码。2、其次要写被委托人的姓名,性别及有效身份证号码。3、然后写委

知识

抚养委托书怎么写

阅读(225)

本文主要为您介绍抚养委托书怎么写,内容包括急请问小孩抚养委托书怎么写,急请问小孩抚养委托书怎么写,请问抚养授权书怎么写急啊最主要格式是什么我们全家都在。委 托 书委托人:XXX,性别:XX,出生:1XX年07月16日,身份证号:65220119620716211X,身份证

知识

异地年检委托书怎么写

阅读(304)

本文主要为您介绍异地年检委托书怎么写,内容包括异地年检委托书怎么填,异地验车委托书怎么开,异地年检委托书怎么填。1.当地车辆应长期在外地使用,车辆须在所属地方出具驾驶证或登记证的原件和复印件,以便进行非现场车辆检查的检查程序。2.必

知识

生育金委托书怎么写

阅读(199)

本文主要为您介绍生育金委托书怎么写,内容包括生育保险委托书怎么写,领生育金的委托书可以是手写的么,生育保险报销委托书怎么写。生育保险委托书范本社会保险管理中心:本人XX,因不能亲自前往贵中心办理生育保险待遇的申领手续,特委托XXX身份

知识

找人要货款委托书怎么写

阅读(246)

本文主要为您介绍找人要货款委托书怎么写,内容包括我委托朋友帮我讨货款,这委托书怎么写,,个人找人要债委托书怎么写,请人代收欠款委托书该怎么写。委托书XXXXXXXXX(单位或部门名称):兹委托XXX(身份证号码:XXXXXXXXXXXXXXXXX)负责办理XXXXXXXXXX

知识

个人欠款诉讼授权委托书怎么写

阅读(258)

本文主要为您介绍个人欠款诉讼授权委托书怎么写,内容包括个人债务追讨委托书范文怎么写,欠款的诉讼时效是多久,个人起诉授权委托书格式,个人债务授权委托书范本格式是怎么样的。一,个人债务追讨委托书怎么写个人债务追讨委托书基本内容应当

知识

医疗事故委托书怎么写

阅读(238)

本文主要为您介绍医疗事故委托书怎么写,内容包括委托医疗事故权限怎写,委托医疗事故权限怎写,打医疗事故请律师委托书怎么写。根据《民事诉讼法》第五十九条规定,委托代理权限分为一般授权和特别授权二种代理方式。一般授权是指代理人只能代

[/e:loop]