1

我正在运行 ASP.NET 4.0 WEBFORMS

这个问题困扰着我......我已经阅读了 SO 以及 MSDN 上的几个线程,但我认为我错过了这个异步拼图的最后一块......

我想要完成的是异步更新标签,作为测试我设置了一个按钮和一个标签。然后我有一个循环,每次循环达到等于或大于 7 的数字时从 0 到 9 计数,我希望它用数字更新标签。

我已经让它同步工作,但是标签最终将只显示最后一个数字。我已经设置了所有方法并连接了事件,但即使我使用 beginInvoke 和 asyncresult,它也不会更新。

目前它根本没有更新,大量的测试让我回到了原点?我设法让它更新,我什至尝试使用 system.threading.thread.sleep(3000),看看它是否更新得很快,但这根本不起作用?

我很困惑有人对如何实现这一点有提示吗?

这是我的代码

首先我的柜台课

public class counter
{
public static event numberHandler FoundNumber;
public delegate void numberHandler(string position);

public void theAscendator()
{
    for (int i = 0; i < 10; i++)
    {
        if (i >= 7)
        {
            string labelText = i.ToString();

            if(FoundNumber != null)
            {
                FoundNumber.BeginInvoke(labelText, new AsyncCallback(this.SevenAndOver),null);                 
            }
        }
    }
}

public void SevenAndOver(IAsyncResult ar)
{
    FoundNumber.EndInvoke(ar);

} 

}

现在我的主页(index.aspx)代码隐藏

public partial class index : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
private void index_FoundNumber(string position)
{

 //   Response.Write(position);

    Label1.Text = position;

    //   throw new NotImplementedException();
}
protected void Button1_Click(object sender, EventArgs e)
{
    counter counterClass = new counter();
    counterClass.theAscendator();        
    counter.FoundNumber += new counter.numberHandler(index_FoundNumber);
}

}

4

1 回答 1

1

我的猜测是您是 Web 新手,并且您可能是桌面专家(wpf/winforms)。对于像您这样从单层应用程序过渡的人来说,这种问题很常见。您必须记住,尽管 webforms 模型看起来像 winforms,但它根本不是那种类型。它是无状态请求/响应客户端/服务器模型(即 HTTP)上的一层薄纱。

这不起作用的原因仅仅是因为当异步计数器类完成时,页面请求已经完成。您无法修改 html,因为它已经被发送回浏览器。一旦点击处理程序完成,页面就“完成”了。asp.net 中的服务器端异步代码本质上是“无头”运行的。最好用来做一些不再需要客户端的工作。

那么,你会怎么做呢?嗯,一开始并不明显,但异步 Web 工作通常由客户端驱动,而不是服务器。客户端是浏览器,技术是 AJAX - 异步 JavaScript 和 XML。这个想法是在服务器上处理事件,返回页面,然后客户端上的 javascript 将轮询服务器以获取新数据,而不会对页面进行完整的回发。

既然我已经说了这么多,实际上有一种方法可以模拟双向异步,但是如果不了解基本原理,您可能会觉得很难。如果您有兴趣,该技术称为 SignalR (http://signalr.net/)。这允许服务器 (asp.net C#) 调用客户端 (javascript) 上的方法,反之亦然。

因此,我的建议是首先从基础层面了解 HTTP 模型,然后开始研究 ASP.NET 等抽象。

于 2012-12-04T13:38:55.707 回答