当前位置: 首页 > news >正文

卖汽车配件怎么做网站/关键词怎么找出来

卖汽车配件怎么做网站,关键词怎么找出来,java做网站都要学哪些,网站制作开发公司同步方法调用在程序继续执行之前需要等待同步方法执行完毕返回结果异步方法则在被调用之后立即返回以便程序在被调用方法完成其任务的同时执行其它操作 异步编程概览 .NET Framework 允许您异步调用任何方法。定义与您需要调用的方法具有相同签名的委托;公共语言运行…

同步方法调用在程序继续执行之前需要等待同步方法执行完毕返回结果
异步方法则在被调用之后立即返回以便程序在被调用方法完成其任务的同时执行其它操作

异步编程概览

.NET Framework 允许您异步调用任何方法。定义与您需要调用的方法具有相同签名的委托;公共语言运行库将自动为该委托定义具有适当签名

的 BeginInvoke 和 EndInvoke 方法。

BeginInvoke 方法用于启动异步调用。它与您需要异步执行的方法具有相同的参数,只不过还有两个额外的参数(将在稍后描述)。

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

EndInvoke 方法用于检索异步调用结果。调用 BeginInvoke 后可随时调用 EndInvoke 方法;如果异步调用未完成,EndInvoke 将一直阻塞到

异步调用完成。EndInvoke 的参数包括您需要异步执行的方法的 out 和 ref 参数(在 Visual Basic 中为 <Out> ByRef 和 ByRef)以及由

BeginInvoke 返回的 IAsyncResult。

四种使用 BeginInvoke 和 EndInvoke 进行异步调用的常用方法。调用了 BeginInvoke 后,可以:

1.进行某些操作,然后调用 EndInvoke 一直阻塞到调用完成。
2.使用 IAsyncResult.AsyncWaitHandle 获取 WaitHandle,使用它的 WaitOne 方法将执行一直阻塞到发出 WaitHandle 信号,然后调用

EndInvoke。这里主要是主程序等待异步方法,等待异步方法的结果。
3.轮询由 BeginInvoke 返回的 IAsyncResult,IAsyncResult.IsCompeted确定异步调用何时完成,然后调用 EndInvoke。此处理个人认为与
相同。
4.将用于回调方法的委托传递给 BeginInvoke。该方法在异步调用完成后在 ThreadPool 线程上执行,它可以调用 EndInvoke。这是在强制装

换回调函数里面IAsyncResult.AsyncState(BeginInvoke方法的最后一个参数)成委托,然后用委托执行EndInvoke。
警告   始终在异步调用完成后调用 EndInvoke。

以上有不理解的稍后可以再理解。

 

例子

1)先来个简单的没有回调函数的异步方法例子

请再运行程序的时候,仔细看注释,对理解很有帮助。还有,若将注释的中的两个方法都同步,你会发现异步运行的速度优越性。

 

None.gifusing System;
None.gif
None.gif 
namespace ConsoleApplication1
ExpandedBlockStart.gifContractedBlock.gif 
dot.gif{
InBlock.gif     
class Class1
ExpandedSubBlockStart.gifContractedSubBlock.gif     
dot.gif{
InBlock.gif         
//声明委托
InBlock.gif
         public delegate void AsyncEventHandler();
InBlock.gif 
InBlock.gif         
//异步方法
InBlock.gif
         void Event1()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            Console.WriteLine(
"Event1 Start");
InBlock.gif            System.Threading.Thread.Sleep(
4000);
InBlock.gif            Console.WriteLine(
"Event1 End");
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
// 同步方法
InBlock.gif
        void Event2()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            Console.WriteLine(
"Event2 Start");
InBlock.gif            
int i=1;
InBlock.gif            
while(i<1000)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                i
=i+1;
InBlock.gif                Console.WriteLine(
"Event2 "+i.ToString());
ExpandedSubBlockEnd.gif            }

InBlock.gif            Console.WriteLine(
"Event2 End");
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        [STAThread]
InBlock.gif        
static void Main(string[] args)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
long start=0;
InBlock.gif            
long end=0;
InBlock.gif            Class1 c 
= new Class1();
InBlock.gif            Console.WriteLine(
"ready");
InBlock.gif            start
=DateTime.Now.Ticks;
InBlock.gif
InBlock.gif            
//实例委托
InBlock.gif
            AsyncEventHandler asy = new AsyncEventHandler(c.Event1);
InBlock.gif            
//异步调用开始,没有回调函数和AsyncState,都为null
InBlock.gif
            IAsyncResult ia = asy.BeginInvoke(nullnull);
InBlock.gif            
//同步开始,
InBlock.gif
            c.Event2();
InBlock.gif            
//异步结束,若没有结束,一直阻塞到调用完成,在此返回该函数的return,若有返回值。
InBlock.gif

InBlock.gif           
InBlock.gif            asy.EndInvoke(ia);
InBlock.gif
InBlock.gif            
//都同步的情况。
InBlock.gif            
//c.Event1();
InBlock.gif            
//c.Event2();
InBlock.gif
           
InBlock.gif            end 
=DateTime.Now.Ticks;
InBlock.gif            Console.WriteLine(
"时间刻度差="+ Convert.ToString(end-start) );
InBlock.gif            Console.ReadLine();
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

None.gif
None.gif
None.gif 
None.gif
None.gif

 

2)下面看有回调函数的WebRequest和WebResponse的异步操作。

 在这里有回调函数,且异步回调中又有异步操作。

None.gifusing System;
None.gif
using System.Net;
None.gif
using System.Threading;
None.gif
using System.Text;
None.gif
using System.IO;
None.gif
None.gif
None.gif
// RequestState 类用于通过
None.gif
// 异步调用传递数据
None.gif
public class RequestState
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif    
const int BUFFER_SIZE = 1024;
InBlock.gif    
public StringBuilder RequestData;
InBlock.gif    
public byte[] BufferRead;
InBlock.gif    
public HttpWebRequest Request;
InBlock.gif    
public Stream ResponseStream;
InBlock.gif    
// 创建适当编码类型的解码器
InBlock.gif
    public Decoder StreamDecode = Encoding.UTF8.GetDecoder();
InBlock.gif
InBlock.gif    
public RequestState()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        BufferRead 
= new byte[BUFFER_SIZE];
InBlock.gif        RequestData 
= new StringBuilder("");
InBlock.gif        Request 
= null;
InBlock.gif        ResponseStream 
= null;
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

None.gif
None.gif
// ClientGetAsync 发出异步请求
None.gif
class ClientGetAsync
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif    
public static ManualResetEvent allDone = new ManualResetEvent(false);
InBlock.gif    
const int BUFFER_SIZE = 1024;
InBlock.gif
InBlock.gif    
public static void Main(string[] args)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif
InBlock.gif        
if (args.Length < 1)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            showusage();
InBlock.gif            
return;
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
// 从命令行获取 URI
InBlock.gif
        Uri HttpSite = new Uri(args[0]);
InBlock.gif
InBlock.gif        
// 创建请求对象
InBlock.gif
        HttpWebRequest wreq = (HttpWebRequest)WebRequest.Create(HttpSite);
InBlock.gif
InBlock.gif        
// 创建状态对象
InBlock.gif
        RequestState rs = new RequestState();
InBlock.gif
InBlock.gif        
// 将请求添加到状态,以便它可以被来回传递
InBlock.gif
        rs.Request = wreq;
InBlock.gif
InBlock.gif        
// 发出异步请求
InBlock.gif
        IAsyncResult r = (IAsyncResult)wreq.BeginGetResponse(new AsyncCallback(RespCallback), rs);
InBlock.gif
InBlock.gif        
// 将 ManualResetEvent 设置为 Wait,
InBlock.gif        
// 以便在调用回调前,应用程序不退出
InBlock.gif
        allDone.WaitOne();
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
public static void showusage()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        Console.WriteLine(
"尝试获取 (GET) 一个 URL");
InBlock.gif        Console.WriteLine(
"\r\n用法::");
InBlock.gif        Console.WriteLine(
"ClientGetAsync URL");
InBlock.gif        Console.WriteLine(
"示例::");
InBlock.gif        Console.WriteLine(
"ClientGetAsync http://www.microsoft.com/net/");
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
private static void RespCallback(IAsyncResult ar)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
// 从异步结果获取 RequestState 对象
InBlock.gif
        RequestState rs = (RequestState)ar.AsyncState;
InBlock.gif
InBlock.gif        
// 从 RequestState 获取 HttpWebRequest
InBlock.gif
        HttpWebRequest req = rs.Request;
InBlock.gif
InBlock.gif        
// 调用 EndGetResponse 生成 HttpWebResponse 对象
InBlock.gif        
// 该对象来自上面发出的请求
InBlock.gif
        HttpWebResponse resp = (HttpWebResponse)req.EndGetResponse(ar);
InBlock.gif
InBlock.gif        
// 既然我们拥有了响应,就该从
InBlock.gif        
// 响应流开始读取数据了
InBlock.gif
        Stream ResponseStream = resp.GetResponseStream();
InBlock.gif
InBlock.gif        
// 该读取操作也使用异步完成,所以我们
InBlock.gif        
// 将要以 RequestState 存储流
InBlock.gif
        rs.ResponseStream = ResponseStream;
InBlock.gif
InBlock.gif        
// 请注意,rs.BufferRead 被传入到 BeginRead。
InBlock.gif        
// 这是数据将被读入的位置。
InBlock.gif
        IAsyncResult iarRead = ResponseStream.BeginRead(rs.BufferRead, 0, BUFFER_SIZE, new AsyncCallback(ReadCallBack), rs);
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif
InBlock.gif    
private static void ReadCallBack(IAsyncResult asyncResult)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
// 从 asyncresult 获取 RequestState 对象
InBlock.gif
        RequestState rs = (RequestState)asyncResult.AsyncState;
InBlock.gif
InBlock.gif        
// 取出在 RespCallback 中设置的 ResponseStream
InBlock.gif
        Stream responseStream = rs.ResponseStream;
InBlock.gif
InBlock.gif        
// 此时 rs.BufferRead 中应该有一些数据。
InBlock.gif        
// 读取操作将告诉我们那里是否有数据
InBlock.gif
        int read = responseStream.EndRead(asyncResult);
InBlock.gif
InBlock.gif        
if (read > 0)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
// 准备 Char 数组缓冲区,用于向 Unicode 转换
InBlock.gif
            Char[] charBuffer = new Char[BUFFER_SIZE];
InBlock.gif
InBlock.gif            
// 将字节流转换为 Char 数组,然后转换为字符串
InBlock.gif            
// len 显示多少字符被转换为 Unicode
InBlock.gif
            int len = rs.StreamDecode.GetChars(rs.BufferRead, 0, read, charBuffer, 0);
InBlock.gif            String str 
= new String(charBuffer, 0, len);
InBlock.gif
InBlock.gif            
// 将最近读取的数据追加到 RequestData stringbuilder 对象中,
InBlock.gif            
// 该对象包含在 RequestState 中
InBlock.gif
            rs.RequestData.Append(str);
InBlock.gif
InBlock.gif
InBlock.gif            
// 现在发出另一个异步调用,读取更多的数据
InBlock.gif            
// 请注意,将不断调用此过程,直到
InBlock.gif            
// responseStream.EndRead 返回 -1
InBlock.gif
            IAsyncResult ar = responseStream.BeginRead(rs.BufferRead, 0, BUFFER_SIZE, new AsyncCallback(ReadCallBack), rs);
ExpandedSubBlockEnd.gif        }

InBlock.gif        
else
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
if (rs.RequestData.Length > 1)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
// 所有数据都已被读取,因此将其显示到控制台
InBlock.gif
                string strContent;
InBlock.gif                strContent 
= rs.RequestData.ToString();
InBlock.gif                Console.WriteLine(strContent);
ExpandedSubBlockEnd.gif            }

InBlock.gif
InBlock.gif            
// 关闭响应流
InBlock.gif
            responseStream.Close();
InBlock.gif
InBlock.gif            
// 设置 ManualResetEvent,以便主线程可以退出
InBlock.gif
            allDone.Set();
ExpandedSubBlockEnd.gif        }

InBlock.gif        
return;
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

None.gif
None.gif 
None.gif
None.gif

 

首先是异步获得ResponseStream,然后异步读取数据。

这个程序非常经典。从中可以学到很多东西的。我们来共同探讨。

 

总结

上面说过,.net framework 可以异步调用任何方法。所以异步用处广泛。

在.net framework 类库中也有很多异步调用的方法。一般都是已Begin开头End结尾构成一对,异步委托方法,外加两个回调函数和AsyncState参数,组成异步操作的宏观体现。所以要做异步编程,不要忘了委托delegate、Begin,End,AsyncCallBack委托,AsyncState实例(在回调函数中通过IAsyncResult.AsyncState来强制转换),IAsycResult(监控异步),就足以理解异步真谛了。

转载于:https://www.cnblogs.com/30ErLi/archive/2010/09/16/1828257.html

http://www.jmfq.cn/news/4952665.html

相关文章:

  • 简约网站首页/安徽网站建设优化推广
  • 学校网站建设栏目有哪些/营销型企业网站建设步骤
  • 网络促销分类 网站促销/今天热点新闻
  • 自己做发卡网站/沈阳网络seo公司
  • 厦门建网站哪家好/目前最靠谱的推广平台
  • 网站建设中企动力优/浏览器下载安装2023版本
  • h5商城网站开发/广告服务平台
  • 排版设计招聘/seo和sem
  • dedecms如何做音乐网站/优化大师免安装版
  • 南城微信网站建设/活动软文模板
  • 上海网站建设公司电话/宁德市教育局官网
  • 重庆市建设工程施工安全管理网站/百度写作助手
  • 石家庄网站建设推广公司报价/学做网站需要学什么
  • 一些做的好的网站/网站权重怎么看
  • 创建一个网站网站空间费用/百度搜索引擎排行榜
  • 做g3云推广需要网站/百度快速优化软件
  • 广告平台投放广告/seo外包公司多少钱
  • 免费域名空间网站/seo外链工具
  • 网站颜色编号/如何推广自己的网站
  • 自己做网站需要主机吗/最新最好的磁力搜索
  • wordpress电影源码/seo策划
  • 做网站和做网页有啥区别/百度应用商店app
  • 眉山网站制作/山西seo
  • 网站建设 考题/廊坊网站设计
  • 网页设计教程详细步骤/北京网站sem、seo
  • 泰州企业模板建站/企业培训权威机构
  • 网站设计者/成都网站制作
  • 移动服务器建设的电影网站/深圳seo排名哪家好
  • 福州做网站的公司/广州最新疫情通报
  • 广州网站优化网站建设/网站收录软件