前言:
如今你们对“net35异步”大体比较注意,兄弟们都想要分析一些“net35异步”的相关内容。那么小编也在网摘上搜集了一些有关“net35异步””的相关内容,希望小伙伴们能喜欢,朋友们快快来学习一下吧!介绍
如今,应用程序通常包括繁重的处理,如科学计算、备份或恢复数据库、多级交叉表报告、汇总数据、文件或目录搜索等。在执行这样的操作时,CPU会被任务完全占用,从而使用户界面没有响应。考虑这样一种情况:编写一个方法来使用长时间运行的循环填充列表框中的项。
源代码1显示此任务的代码:
private void ExecuteTask() { for (long i = 1; i < 100000000000; i++) { lstCustomers.items.Add(i.ToString()); } }
源代码2在btnStart控件的click事件上调用源代码1中的方法
private void btnStart_Click(object sender, EventArgs e) { ExecuteTask(); MessageBox.show(“Finished”); }
执行此应用程序后,系统可能需要很长时间来处理要在列表框中显示的信息。在这种情况下,有必要通知用户应用程序的状态。另外,将此任务分配到后台可能更明智,同时保持用户界面的响应性并继续在前台运行其他任务。
异步编程
异步编程是一个概念,在后台运行耗时的应用程序,同时执行其他任务。然而,即使在后台执行操作,也需要将状态通知用户。推荐的方法是使用标签、文本框或状态栏向用户显示进程的状态。
这种情况的一个例子是文件或目录搜索操作,其中可以使用文本框或标签控件来显示搜索操作的当前状态。另一个例子是CD刻录软件。各种聊天应用程序,如Yahoo或MSN Messenger,利用状态栏让用户知道操作的状态。进度条控件还可以显示需要很长时间才能执行的操作的进度。这种在同时进行后台操作时响应用户输入的系统也称为交互系统。
异步编程只使用一个线程,仍然允许执行后台任务。它们还遵循线性执行模式,并保持用户界面的响应性。
尽管异步编程只使用一个线程,并且仍然允许执行后台任务。它们还遵循线性执行模式,并保持用户界面的响应性。
尽管异步编程为开发人员提供了一些好处,但它不能随意使用。如果不必要地使用,它会影响应用程序的性能。
使用委托的异步编程
开发人员通常使用委托来调用.NET中的异步方法。委托的签名应始终与方法的签名匹配。例如,如果有一个名为LongTask()的方法将int作为参数并返回整数,那么应该定义一个委托,如下代码所示。
public delegate int LongTaskDelegate(int time, ref int refParam);
定义委托后,公共语言运行库(CLR)会自动在该委托上定义BeginInvoke()和EndInvoke()方法,可以调用这些方法以异步执行引用的方法。
方法启动异步操作并立即返回,返回对实现IAsyncResult接口的对象的引用。应用程序访问接口以监视异步操作的进度。程序完成后,调用EndInvoke()方法以获得结果。
使用BeginInvoke()和EndInvoke()进行异步调用的四种方法。BeginInvoke()方法用于启动调用。
启动后,将执行以下任务:
做一些工作,然后调用EndInvoke()。如果异步操作没有完成,EndInvoke()将阻塞直到它完成。使用从接口IAsyncResult获得的WaitHandle。AsyncWaitHandle,调用WaitOne()方法阻止,直到操作完成。然后调用EndInvoke()。投票表决IAsynResult.IsCompleted已完成属性来确定异步操作何时完成。然后调用EndInvoke()。为提供给BeginInvoke()的回调函数传递委托(类型为IAsyncCallback)。当异步操作完成时,将执行回调函数。回调函数中的代码调用EndInvoke()。
源代码
private void btnStart_Click(object sender, EventArgs e) { LongTaskDelegate objLongDeleg = new LongTaskDelegate(LongOperation); int refParam = 0; //call BeginInvoke to initialize the asynchronous operation IAsyncResult ar = objLongDeleg.BeginInvoke(5000, ref refParam, null, null_; //Poll for completion while (!ar.IsCompleted) { MessageBox.show(“Waiting for completion”); System.Threading.Thread.Sleep(1000); } //Call EndInvoke to harvest the Result int longResult = objLongDeleg.EndInvoke(ref refParam, ar); txtResult.Text = ”Result = ”+longResult.ToString() + “\r” + “Reference Parameter” + refParam.ToString(); } public int LongOperation(int time, ref int refParam) { //Simulate a long running operation while (time > 0) { System.Threading.Thread.Sleep(1000); Time -= 1000; } refParam = .56; return 1; }
在此源代码中,程序对启动长操作的方法进行异步调用。程序只是进入一个等待循环,显示消息直到指定的秒数结束。然后设置返回值,包括ref参数。应用程序在等待异步调用完成时执行其他任务。
IASyncResult接口
IASyncResult接口表示异步操作的状态。它有四个重要特性,如下所示:
AsyncState:返回一个用户定义的对象,其中包含有关异步操作的信息CompletedSynchronously:确定异步操作是否同步完成。IsCompleted:确定操作是否完成。AsyncWaitHandle:返回用于等待操作完成的WaitHandle对象。小结
当耗时可能导致用户界面无响应时,使用异步编程。委托通常用于调用.NET中的异步方法。每个委托都隐式定义一个BeginInvoke()和一个EndInvoke()方法。IAsyncResult接口表示异步操作的状态。
标签: #net35异步