龙空技术网

NET中的异步编程

笨笨猿 1113

前言:

如今你们对“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异步