采用异步回调显示实时股价

无论在股票或者基金网站,可以看到股票的价格实时变化,并且整个页面感觉不到刷新,仅仅是股票的价格在不断变化,这个是如何实现的呢?

1、新增一个自定义用户控件文件Callback.ascx

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="Callback.ascx.cs"
Inherits="ClientControl_Callback" %>
<script type="text/javascript" lang="javascript">
    function <%=this.ID%>_OnCallbackCompleteDefault(ret) {
    }
</script>
using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class ClientControl_Callback : System.Web.UI.UserControl, System.Web.UI.ICallbackEventHandler
{
    public class CallbackEventArgs
    {
        public CallbackEventArgs()
        {
        }

        public CallbackEventArgs(string Parameter, string Result)
        {
            parameter = Parameter;
            result = Result;
        }

        private string parameter = "";
        public string Parameter
        {
            get { return parameter; }
            set { parameter = value; }
        } 

        private string result = "";
        public string Result
        {
            get { return result; }
            set { result = value; }
        }
    }

    public delegate void CallbackEventHandler(object source, CallbackEventArgs e);
    public event CallbackEventHandler Callback;
    private CallbackEventArgs EventArgs;

    #region 属性

    public string ClientPerformCallback
    {
        get
        {
            if (this.ViewState["ClientPerformCallback"] != null)
                return (string)this.ViewState["ClientPerformCallback"];
            return string.Empty;
        }
        set
        {
            this.ViewState["ClientPerformCallback"] = value;
        }
    } 

    public string ClientCompleteEvent
    {
        get
        {
            if (this.ViewState["ClientCompleteEvent"] != null)
                return (string)this.ViewState["ClientCompleteEvent"];
            return string.Empty;
        }
        set
        {
            this.ViewState["ClientCompleteEvent"] = value;
        }
    }

    public string ClientErrorEvent
    {
        get
        {
            if (this.ViewState["ClientErrorEvent"] != null)
                return (string)this.ViewState["ClientErrorEvent"];
            return string.Empty;
        }
        set
        {
            this.ViewState["ClientErrorEvent"] = value;
        }
    }

    #endregion
 
    protected void Page_Load(object sender, EventArgs e)
    {
        Callback += new CallbackEventHandler(OnCallback);

        string cbReference = "";
        string completeEvent = ClientCompleteEvent;

        if (string.IsNullOrEmpty(ClientCompleteEvent))
        {
            completeEvent = this.ID + "_OnCallbackCompleteDefault";
        }
        if (string.IsNullOrEmpty(ClientErrorEvent))
        {
            cbReference = Page.ClientScript.GetCallbackEventReference(
                this, "arg", completeEvent, "context", true);
        }
        else
        {
            cbReference = Page.ClientScript.GetCallbackEventReference(
                this, "arg", completeEvent, "context", ClientErrorEvent, true);
        } 

        string callbackScript = "function " + ClientPerformCallback + "(arg, context)"
                                + "{ " + cbReference + "} ;";
        Page.ClientScript.RegisterClientScriptBlock(this.GetType(), this.ID + "_CallBackJS_"
              + ClientPerformCallback, callbackScript, true);
    }

    protected virtual void OnCallback(object source, CallbackEventArgs e)
    {
    }

    string ICallbackEventHandler.GetCallbackResult()
    {
        return EventArgs.Result;
    }

    void ICallbackEventHandler.RaiseCallbackEvent(string eventArgument)
    {
        EventArgs = new CallbackEventArgs(eventArgument, "");
        Callback(this, EventArgs);
    }
}

2、使用该自定义用户控件实现局部刷新的效果

新建一个Test.aspx页面

<%@ Page Title="" Language="C#"  AutoEventWireup="true" CodeFile="Test.aspx.cs"%>
<%@ Register TagPrefix="cb" TagName="Callback" Src="~/Callback.ascx" %>
<script type="text/javascript" src="~/json2.js"></script>
<script type="text/javascript" language="javascript">
        $(function () {
            performCallback1();
            setInterval("performCallback1();", 10 * 1000);

        }); 

        function onCallbackComplete1(ret) {
            var mytable= document.getElementById("table1");;
            $("#table1").empty();
            if (ret == ‘‘ || ret == ‘[]‘) {
                return;
            } else {
                var stocks = JSON.parse(ret);
                for (var i = 0; i < stocks.length; i++) {
                    var row = mytable.insertRow(i);
                    var cell = row.insertCell(0);
                    cell.setAttribute("id", "tb_" + i + "_0");
                    $("#tb_" + i + "_0").text(stocks[i].Name);
                     cell = row.insertCell(1);
                    cell.setAttribute("id", "tb_" + i + "_1");
                    $("#tb_" + i + "_1").text(stocks[i].Price);
                }
            }
        }
 </script>

<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder2" runat="Server">
    <table id="table1">

    </table>
    <cb:Callback ID="Callback1" runat="server" OnCallback="Callback1_Callback"
       ClientCompleteEvent="onCallbackComplete1" ClientPerformCallback="performCallback1"/>
</asp:Content>

后台代码:

using System;
using System.IO;
using System.Collections;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data;
using System.Text;

using Newtonsoft.Json;

public partial class Test : BasePage
{

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
        }
    }
    protected void Callback1_Callback(object source, UserControl_Callback.CallbackEventArgs e)
    {
        List<Stock> stockList = new List<Stock>();
        Random rdm =new Random();
        Stock stock = new Stock();
        stock.Name = "交通银行";
        stock.Price = rdm.Next(10);
        stockList.Add(stock);
        stock = new Stock();
        stock.Name = "民生银行";
        stock.Price = rdm.Next(10);
        stockList.Add(stock);
        e.Result = JavaScriptConvert.SerializeObject(stockList); ;
    }
}

 public class Stock
{
    private string _Name;
    public string Name
    {
        get { return _Name; }
        set { _Name = value; }
    }

    private float _Price;
    public float Price
    {
        get { return _Price; }
        set { _Price = value; }
    }
}

采用异步回调显示实时股价

时间: 2024-10-28 02:29:00

采用异步回调显示实时股价的相关文章

关于C10K、异步回调、协程、同步阻塞

最近到处在争论这些话题,发现很多人对一些基础的常识并不了解,在此发表一文做一下解释.此文未必能解答所有问题,各位能有一个大致的了解就好. C10K的由来 大家都知道互联网的基础就是网络通信,早期的互联网可以说是一个小群体的集合.互联网还不够普及,用户也不多.一台服务器同时在线100个用户估计 在当时已经算是大型应用了.所以并不存在什么C10K的难题.互联网的爆发期应该是在www网站,浏览器,雅虎出现后.最早的互联网称之为Web1.0, 互联网大部分的使用场景是下载一个Html页面,用户在浏览器中

State Threads——异步回调的线性实现

State Threads——异步回调的线性实现 原文链接:http://coolshell.cn/articles/12012.html 本文的标题看起来有点拗口,其实State Threads库就是在单线程中使用同步编程思想来实现异步的处理流程,从而实现单线程能并发处理成百上千个请求,而且每个请求的处理过程是线性的,没有使用晦涩难懂的callback机制来衔接处理流程. ST (State Threads) 库提供了一种高性能.可扩展服务器(比如web server.proxy server

从一个nodejs爬虫来看nodejs异步回调嵌套时数据的安全性[原创,未经授权禁止转载]

代码如下: /** * Created by Totooria Hyperion on 2016/4/20. */ 'use strict'; const fs = require('fs');const path = require('path');const cheerio = require('cheerio');const request = require('request'); function getCategoryByUrl(url,callback){ request(url,

如何优雅的处理Nodejs中的异步回调

前言 Nodejs最大的亮点就在于事件驱动, 非阻塞I/O 模型,这使得Nodejs具有很强的并发处理能力,非常适合编写网络应用.在Nodejs中大部分的I/O操作几乎都是异步的,也就是我们处理I/O的操作结果基本上都需要在回调函数中处理,比如下面的这个读取文件内容的函数: fs.readFile('/etc/passwd', function (err, data) { if (err) throw err; console.log(data); }); 那,我们读取两个文件,将这两个文件的内

Nodejs异步回调的优雅处理方法

这篇文章主要介绍了Nodejs异步回调的优雅处理方法,本文使用了ES6中的新特性,用一种十分优雅的方式解决了回调问题,需要的朋友可以参考下 前言 Nodejs最大的亮点就在于事件驱动, 非阻塞I/O 模型,这使得Nodejs具有很强的并发处理能力,非常适合编写网络应用.在Nodejs中大部分的I/O操作几乎都是异步的,也就是我们处理I/O的操 作结果基本上都需要在回调函数中处理,比如下面的这个读取文件内容的函数: 复制代码 代码如下: fs.readFile('/etc/passwd', fun

Android Binder机制中的异步回调

“Binder通信是同步而不是异步的”,但是在实际使用时,是设计成客户端同步而服务端异步. 看看Framwork层的各service类java源码便会知道,在客户端调用服务端的各种方法时,通常会传递一个Binder过来,该Binder对象用于服务端做异步回调,而服务端本身会使用handler或队列的方式做成异步处理.在Android中,系统service是作为"管理者"的身份存在的,像Ams(ActivityManagerService),它并不创建Activity,创建Activit

【UE4实用技能】写一个异步回调的蓝图接口

在做系统功能的时候经常需要到服务器去下载图片然后再显示,蓝图已经提供了这个接口供大家使用: 如果没有别的其他需求,那这个接口就够用了. 不过我们的项目需要在这个接口的基础上加一些功能:1.本地缓存(不需要每次都请求)2.把图片存放到硬盘(不需要每次重启游戏都重新下载)3.设定一个文件数量阈值,超过这个值就删掉最早的文件4.判断一下路径,如果是本地的图片直接加载,网络图片加载(整合所有图片加载接口为唯一一个) 因为改动比较多所以不在DownloadImage这个接口上改,重新写一个类来处理.(具体

微信扫码支付功能(2)---用户扫码支付成功,微信异步回调商户接口

用户扫码支付成功,微信异步回调商户 上一篇博客完成用户扫码支付功能: https://www.cnblogs.com/qdhxhz/p/9708534.html 当用户扫码支付成功之后,微信会异步回调商户接口,告知用户支付成功.好让商户进行下一步操作. 一.接口说明 1.流程图 这里要做的就是用户支付成功后,微信异步通知商户支付结果,商户收到通知后告知支付通知接收情况. 2.接口说明 有关商户接口应注意以下几点: (1)该链接是通过[统一下单API]中提交的参数notify_url设置,如果链接

异步回调,事件,线程池与协程

在发起一个异步任务时,指定一个函数任务完成后调用函数 为什么需要异步 在使用线程池或进程池提交任务时想要任务的结果然后将结果处理,调用shudown 或者result会阻塞 影响效率,这样的话采用异步调用 比如result本来是用水壶烧水烧开了拿走,烧下一个 用shutdown可以将水壶一起烧但是一个一个拿走 call_done_back是一起烧,每个好了会叫你拿走做其他事 . 1.使用进程池时,回调函数都是主进程中执行执行 2. 使用线程池时,回调函数的执行线程是不确定的,哪个线程空闲就交给哪