//定义委托
public delegate void AsyncDelegate(string year, string month, string path);//异步调用
btnBuild.Enabled = false;
AsyncDelegate dlgt = new AsyncDelegate(CreateMonthReport);
IAsyncResult ar = dlgt.BeginInvoke(year, month, path, new AsyncCallback(CallbackMethod), dlgt);//回调方法
public void CallbackMethod(IAsyncResult ar)
{
AsyncDelegate dlgt = (AsyncDelegate)ar.AsyncState;
dlgt.EndInvoke(ar); if (ar.IsCompleted)
{
btnBuild.Enabled = true;
}
}现在我碰到的问题是:
CallbackMethod方法能够执行,btnBuild.Enabled = true语句也能执行到,可就是在页面上,它的状态始终不变化???还是btnBuild.Enabled = false的状态。郁闷ing,高手帮忙。
解决方案 »
- gridview中导出Execl时也导出footer中的数据
- 系统找不到指定的文件。Could not load file or assembly 'Microsoft.ReportViewer.WebForms, Ver
- 操作XML文档的问题
- 有难度!!
- 关于radiobuttonlist事件的响应?在线等
- SqlDataSource的查询语句到底查到了多少条语句,如何写代码取得?
- 中专生,你的程序员成长之路!
- 如何得到鼠标单击下Label的Text值
- ASP页面,或者VB中可以调用asp.net编译的dll文件吗?请教高手
- 小调查:大家对JScript.NET怎么看?
- ie 6下 dropdownlist 出现在层上面
- .net 如何实现下图的功能
情况是这样的:帮客户做一个内部使用的网站,其中有需要生成月报的这样一个操作,这个操作比较费时,代码执行下来的话,要两三分钟(具体在优化中,但是以客户的要求,也优化不了多少),所以客户就说那就用异步吧。
再来介绍一下这个客户,他是做技术出身的,对于这个网站的实现,好多是我们以他的想法为主,因为他说这样实现好,就很难更改,没办法,“拿人钱财”嘛。慕白兄,
你说的“主线程已经返回了.当前的httpcontext捕捉不到了.”,我刚刚在回调方法里写了System.Web.HttpContext.Current.Response.Redirect("abc.aspx")这种代码,System.Web.HttpContext.Current确实是Null的有什么方法吗?指教
当然,这是手工去操作。而改为定时刷新,不算什么技术活。
针对“Lost_painting”的“因为Http是短连接,一旦完成响应客户端请求的任务就会断开与客户端的连接”,那么我是否可以在我的回调函数里再调用一次请求,然后把设置按钮可见性的语句放在这个按钮的Click事件里,代码如://回调方法
public void CallbackMethod(IAsyncResult ar)
{
AsyncDelegate dlgt = (AsyncDelegate)ar.AsyncState;
dlgt.EndInvoke(ar); if (ar.IsCompleted)
{
btnSet_Click(btnSet,new EventArgs());
}
}public void btnSet_Click(object sender,EventArgs e)
{
btnBuild.Enable=false;
}
写法大致这样吧,没在编译器中,不知道正确与否,望高手指点
----------------------------
很简单
你可以在用户的这个页面里面,使用AJAX,当他点击按钮的时候,仍然是禁用按钮,在点击按钮的事件里面,使用脚本异步调用的方式,向服务器发送一个请求,而你可以在被请求的页面,执行你原来的所有语句让它计算,当计算完毕,返回给调用者一个信号,脚本接收到这个信号时,知道服务端已经OK了,此时可将按钮解除禁用,并通知用户(脚本弹出):报表已经生成好了.脚本方面的异步,你可使用jquery来实现,还是比较容易的
下面是一个示例的简单代码
<input type=button onclick="f();">
<script language=javascript>
function f()
{
$.ajax(
{
url: "你要执行报表生成的页面地址,可直接在地址后加参数",
type: 'Post',
async: true,
cache: true,
success: function(html)
{
//HTML就是你生成报表页面返回的信号
if(html == "OK")
{
alert("告诉用户:报表已经生成好了");
}
else
{
//错误
}
}
});
}
</script>在生成报表的页面中,生成完成之后,如下输出
string xx = "OK";
this.Response.Clear();
this.Response.Write(xx);
this.Response.End();当然,你可以输出更多信息,在客户端使用脚本拆分也可.但一定要遵循上述写法.