求助:关于异步的疑问

我认为的异步的功能应该是在网页上面不是异步先显示出来,然后异步执行的东西后显示出来,就是不让用户有很慢的感觉!

然后我复制了msdn上的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Threading;

namespace WebApplication1
{
public partial class WebForm2 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}

protected void Button1_Click(object sender, EventArgs e)
{
this.lable1.Text=DateTime.Now.ToString();
SlowTask slowTask1 = new SlowTask();

PageAsyncTask asyncTask1 = new PageAsyncTask(slowTask1.OnBegin, slowTask1.OnEnd, slowTask1.OnTimeout, null);

Page.RegisterAsyncTask(asyncTask1);

Page.ExecuteRegisteredAsyncTasks();

this.lable2.Text = slowTask1.GetAsyncTaskProgress();
}
}

public class SlowTask
{
private String _taskprogress;
private AsyncTaskDelegate _dlgt;

protected delegate void AsyncTaskDelegate();

public String GetAsyncTaskProgress()
{
return _taskprogress;
}

public void ExecuteAsyncTask()
{
Thread.Sleep(TimeSpan.FromSeconds(5.0));
}

public IAsyncResult OnBegin(object sender, EventArgs e, AsyncCallback cb, object extraData)
{
_taskprogress = "AsyncTask started at: " + DateTime.Now + ". ";

_dlgt = new AsyncTaskDelegate(ExecuteAsyncTask);
IAsyncResult result = _dlgt.BeginInvoke(cb, extraData);

return result;
}

public void OnEnd(IAsyncResult ar)
{
_taskprogress += "AsyncTask completed at: " + DateTime.Now;
_dlgt.EndInvoke(ar);
}

public void OnTimeout(IAsyncResult ar)
{
_taskprogress += "AsyncTask failed to complete " +
"because it exceeded the AsyncTimeout parameter.";
}
}
}



然后运行,lable1与lable2的结果同时显示出来,为什么不是lable1的结果先显示出来,然后5秒后再显示label2的结果呢?
是不是我把异步理解错了?
...全文
68 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
LMAOhuaNL 2011-08-10
  • 打赏
  • 举报
回复
说白了就是一步步的操作,不影响全局的,Ajax异步刷新就是个典型
baysos 2011-08-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lmaohuanl 的回复:]
说白了就是一步步的操作,不影响全局的,Ajax异步刷新就是个典型
[/Quote]
你这分明说的同步啊……
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wggfcusmq 的回复:]
自己做了一个测试,异步竟然比同步还要慢。
[/Quote]

那是因为在异步处理的时候你把那个线程Thread.Sleep(TimeSpan.FromSeconds(5.0));
打断点跑吧
  • 打赏
  • 举报
回复

using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Threading;

namespace WebApplication1
{
public partial class _Default : System.Web.UI.Page
{
public delegate void IAsyncDelegate();

DateTime time1;
protected override void OnPreInit(EventArgs e)
{
base.OnPreInit(e);
time1 = DateTime.Now;
}

void Page_Load(object sender, EventArgs e)
{
Response.Write("Page_Load: thread #" + System.Threading.Thread.CurrentThread.GetHashCode() + "<br />");
Response.Write("==============<br />");

//分别注释掉以下同步与异步的代码,打印执行时间。
//1 异步
BeginEventHandler bh = new BeginEventHandler(this.BeginGetAsyncData);
EndEventHandler eh = new EndEventHandler(this.EndGetAsyncData);
AddOnPreRenderCompleteAsync(bh, eh);

//2 同步
//show_a();
}

private void show_a()
{
Int64 j = 0;

for (Int64 i = 1; i < 500000000; i++)
{
j = j + i;
}

Response.Write(j.ToString() + "<br />");

Response.Write("Page_Load: thread #" + System.Threading.Thread.CurrentThread.GetHashCode() + "<br />");
}

private void show()
{
Response.Write("BeginGetAsyncData: thread #" + Thread.CurrentThread.GetHashCode() + "<br />");
}

IAsyncResult BeginGetAsyncData(Object src, EventArgs args, AsyncCallback cb, Object state)
{
Int64 j = 0;
for (Int64 i = 1; i < 500000000; i++)
{
j = j + i;
}

Response.Write(j.ToString() + "<br />");
IAsyncDelegate iasy = new IAsyncDelegate(show);
IAsyncResult result = iasy.BeginInvoke(cb, state);

return result;
}

void EndGetAsyncData(IAsyncResult ar)
{
Response.Write("EndGetAsyncData: thread #" + Thread.CurrentThread.GetHashCode() + "<br />");
Response.Write("==============<br />");
}

protected override void OnPreRenderComplete(EventArgs e)
{
base.OnPreRenderComplete(e);
DateTime time2 = DateTime.Now;
TimeSpan ts = time2.Subtract(time1);
Response.Write("加载时间:" + ts.TotalMilliseconds);
}
}
}

  • 打赏
  • 举报
回复
看了这篇文章http://www.bitscn.com/pdb/dotnet/200904/160607.html后,貌似懂了,自己做一个测试页,速度比同步的还慢。
ycproc 2011-08-10
  • 打赏
  • 举报
回复
在你都没懂的时候 你照搬别人的 得出来的结论往往是 非常的离谱
  • 打赏
  • 举报
回复
自己做了一个测试,异步竟然比同步还要慢。
  • 打赏
  • 举报
回复
能帮我看看我最后一段的疑问吗?
然后运行,lable1与lable2的结果同时显示出来,为什么不是lable1的结果先显示出来,然后5秒后再显示label2的结果呢?
是不是我把异步理解错了?
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 dongxinxi 的回复:]

引用 4 楼 wggfcusmq 的回复:
自己做了一个测试,异步竟然比同步还要慢。


那是因为在异步处理的时候你把那个线程Thread.Sleep(TimeSpan.FromSeconds(5.0));
打断点跑吧
[/Quote]

我测试的代码用的是7楼的。
  • 打赏
  • 举报
回复
异步就是 你开始一个操作,程序在操作完成之前可以继续后续的工作,当操作完成后,触发事件或者使用回调来处理操作完成的手续。
一般来说异步操作都是启动一个新的线程去处理你的请求,完成之后调用你指定的回调函数来完成整个异步操作。
trade_create_by_buyer-CSHARP-UTF-8 │ ├app_code ┈┈┈┈┈┈┈┈┈┈类文件夹 │ │ │ ├AlipayConfig.cs┈┈┈┈┈基础配置类文件 │ │ │ ├AlipayCore.cs┈┈┈┈┈┈支付宝接口公用函数类文件 │ │ │ ├AlipayNotify.cs┈┈┈┈┈支付宝通知处理类文件 │ │ │ ├AlipaySubmit.cs┈┈┈┈┈支付宝各接口请求提交类文件 │ │ │ └MD5.cs ┈┈┈┈┈┈┈┈┈MD5类库 │ ├log┈┈┈┈┈┈┈┈┈┈┈┈┈日志文件夹 │ ├default.aspx ┈┈┈┈┈┈┈┈支付宝接口入口文件 ├default.aspx.cs┈┈┈┈┈┈┈支付宝接口入口文件 │ ├notify_url.aspx┈┈┈┈┈┈┈服务器异步通知页面文件 ├notify_url.aspx.cs ┈┈┈┈┈服务器异步通知页面文件 │ ├return_url.aspx┈┈┈┈┈┈┈页面跳转同步通知文件 ├return_url.aspx.cs ┈┈┈┈┈页面跳转同步通知文件 │ ├Web.Config ┈┈┈┈┈┈┈┈┈配置文件(集成时删除) │ └readme.txt ┈┈┈┈┈┈┈┈┈使用说明文本 ※注意※ 需要配置的文件是: alipay_config.cs default.aspx default.aspx.csreturn_url.aspx return_url.aspx.cs notify_url.aspx notify_url.aspx.cs统一命名空间为:namespace Com.Alipiay ───────── 类文件函数结构 ───────── AlipayCore.cs public static Dictionary ParaFilter(SortedDictionary dicArrayPre) 功能:除去数组中的空值和签名参数并以字母a到z的顺序排序 输入:SortedDictionary dicArrayPre 过滤前的参数组 输出:Dictionary 去掉空值与签名参数后的新签名参数组 public static string CreateLinkString(Dictionary dicArray) 功能:把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串 输入:Dictionary dicArray 需要拼接的数组 输出:string 拼接完成以后的字符串 public static string CreateLinkStringUrlencode(Dictionary dicArray, Encoding code) 功能:把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串,并对参数值做urlencode 输入:Dictionary dicArray 需要拼接的数组 Encoding code 字符编码 输出:string 拼接完成以后的字符串 public static void log_result(string sPath, string sWord) 功能:写日志,方便测试(看网站需求,也可以改成存入数据库) 输入:string sPath 日志的本地绝对路径 string sWord 要写入日志里的文本内容 public static string GetAbstractToMD5(Stream sFile) 功能:获取文件的md5摘要 输入:Stream sFile 文件流 输出:string MD5摘要结果 public static string GetAbstractToMD5(byte[] dataFile) 功能:获取文件的md5摘要 输入:byte[] dataFile 文件流 输出:string MD5摘要结果 ┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉ MD5.cs public static string Sign(string prestr, string key, string _input_charset) 功能:签名字符串 输入:string prestr 需要签名的字符串 string key 密钥 string _input_charset 编码格式 输出:string 签名结果 public static bool Verify(string prestr, string sign, string key, string _input_charset) 功能:验证签名 输入:string prestr 需要签名的字符串 string sign 签名结果 string key 密钥 string _input_charset 编码格式 输出:string 验证结果 ┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉ AlipayNotify.cs public Notify() 功能:构造函数 从配置文件中初始化变量 public bool Verify(SortedDictionary inputPara, string notify_id, string sign) 功能:验证消息是否是支付宝发出的合法消息 输入:SortedDictionary inputPara 通知返回参数数组 string notify_id 通知验证ID string sign 支付宝生成的签名结果 输出:bool 验证结果 private string GetPreSignStr(SortedDictionary inputPara) 功能:获取待签名字符串(调试用) 输入:SortedDictionary inputPara 通知返回参数数组 输出:string 待签名字符串 private bool GetSignVeryfy(SortedDictionary inputPara, string sign) 功能:获取返回回来的待签名数组签名后结果 输入:SortedDictionary inputPara 通知返回参数数组 string sign 支付宝生成的签名结果 输出:bool 签名验证结果 private string GetResponseTxt(string notify_id) 功能:获取是否是支付宝服务器发来的请求的验证结果 输入:string notify_id 通知验证ID 输出:string 验证结果 private string Get_Http(string strUrl, int timeout) 功能:获取远程服务器ATN结果 输入:string strUrl 指定URL路径地址 int timeout 超时时间设置 输出:string 服务器ATN结果字符串 ┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉ AlipaySubmit.cs private static string BuildRequestMysign(Dictionary sPara) 功能:生成签名结果 输入:Dictionary sPara 要签名的数组 输出:string 签名结果字符串 private static Dictionary BuildRequestPara(SortedDictionary sParaTemp) 功能:生成要请求给支付宝的参数数组 输入:SortedDictionary sParaTemp 请求前的参数数组 输出:Dictionary 要请求的参数数组 private static string BuildRequestParaToString(SortedDictionary sParaTemp, Encoding code) 功能:生成要请求给支付宝的参数数组 输入:SortedDictionary sParaTemp 请求前的参数数组 Encoding code 字符编码 输出:string 要请求的参数数组字符串 public static string BuildRequest(SortedDictionary sParaTemp, string strMethod, string strButtonValue) 功能:建立请求,以表单HTML形式构造(默认) 输入:SortedDictionary sParaTemp 请求参数数组 string strMethod 提交方式。两个值可选:post、get string strButtonValue 确认按钮显示文字 输出:string 提交表单HTML文本 public static string BuildRequest(SortedDictionary sParaTemp) 功能:建立请求,以模拟远程HTTP的POST请求方式构造并获取支付宝的处理结果 输入:SortedDictionary sParaTemp 请求参数数组 输出:string 支付宝处理结果 public static string BuildRequest(SortedDictionary sParaTemp, string strMethod, string fileName, byte[] data, string contentType, int lengthFile) 功能:建立请求,以模拟远程HTTP的POST请求方式构造并获取支付宝的处理结果 输入:SortedDictionary sParaTemp 请求参数数组 string strMethod 提交方式。两个值可选:post、get string fileName 文件绝对路径 byte[] data 文件数据 string contentType 文件内容类型 int lengthFile 文件长度 输出:string 支付宝处理结果 public static string Query_timestamp() 功能:用于防钓鱼,调用接口query_timestamp来获取时间戳的处理函数 输出:string 时间戳字符串 ────────── 出现问题,求助方法 ────────── 如果在集成支付宝接口时,有疑问或出现问题,可使用下面的链接,提交申请。 https://b.alipay.com/support/helperApply.htm?action=supportHome 我们会有专门的技术支持人员为您处理

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧