C# dll事件中如何执行Javascript的回调函数

前言:

由于js 远程请求  XMLHttpRequest() 不支持多线程,所以用C# 写了个dll 多线程远程抓住供js调用。

最初代码为:

C#代码

/// <summary>
        /// 异步请求入口
        /// </summary>
        /// <param name="url">传入http地址 注意加http</param>
        /// <param name="timeoutStr">超时时间</param>
        public  void AsyncGet(string url, int timeoutStr)
        {
            try
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(url));
                request.Timeout = timeoutStr;
                request.BeginGetResponse(new AsyncCallback(ReadCallBack), request);
            }
            catch (Exception) { }
        }

        /// <summary>
        /// 执行回调时候异步最终拿到值
        /// 正常获取反馈值,异常时候值为 timeout
        /// </summary>
        public  string returnContent { get; set; }

        /// <summary>
        /// 执行异步回调请求
        /// </summary>
        /// <param name="asynchronousResult"></param>
	/// 查看本栏目更多精彩内容:http://www.bianceng.cn/Programming/csharp/
        private  void ReadCallBack(IAsyncResult asynchronousResult)
        {
            try
            {
                HttpWebRequest reqeust = (HttpWebRequest)asynchronousResult.AsyncState;
                HttpWebResponse response = (HttpWebResponse)reqeust.EndGetResponse(asynchronousResult);
                StreamReader readContent = new StreamReader(response.GetResponseStream());
                returnContent = readContent.ReadToEnd().ToString();
            }
            catch (Exception)
            {
                returnContent = "timeout";
            }
        }

js 代码:

var Gtime = 5;
    function getUrl (turl) {
        if (Gtime==5) {
            comActiveX.AsyncGet(turl,Gtime);
        }
        if (Gtime>0 && comActiveX.returnContent==undefined) {
            setTimeout("getUrl('"+turl+"')",1000);
            alert(comActiveX.returnContent);
            Gtime -- ;
        }else{
            document.write( comActiveX.returnContent);
        }
    }

这里存在问题,js必须一直去询问dll 是否获取到数据,直到获取到数据才做下面处理,虽然其中可以做其他事情,但是这跟同步等待没有多大区别。

windows 经典编程 有句话叫“don't call me , I will call you!” ,这就是事件的引入,那么这里可以不可以优化为,当有数据拿到以后自动通知js,js能不能注册一个回调函数。 开始一通尝试,最终找到相关答案:

C# 加入以下代码:

public delegate void EventHandler(string data);
    [Guid("9771B223-6188-4849-B292-C7D9D8173E49")]
    [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    public interface ControlEvents
    {
        [DispId(0x60020000)]
        void events_puhuo(string data);
    }

    /// <summary>
    /// 采集类
    /// </summary>
    [ClassInterface(ClassInterfaceType.AutoDual), ComSourceInterfaces(typeof(ControlEvents))]
    public class CollectGood : UserControl
    {

        public event EventHandler eventsGet;

        private delegate void UpEventDelegate(string msg);

        public void Reback(string msg)
        {
            UpEventDelegate up = new UpEventDelegate(UpEvent);
            this.BeginInvoke(up, msg);
        }
        private void UpEvent(string msg)
        {
            if (eventsGet != null)
            {
                eventsGet(msg);
            }
        }

        #region httpWebRequest 异步请求Get方法
        /// <summary>
        /// 异步请求入口
        /// </summary>
        /// <param name="url">传入http地址 注意加http</param>
	/// 查看本栏目更多精彩内容:http://www.bianceng.cn/Programming/csharp/
        /// <param name="timeoutStr">超时时间</param>
        public  void AsyncGet(string url, int timeoutStr)
        {
            try
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(url));
                request.Timeout = timeoutStr;
                request.BeginGetResponse(new AsyncCallback(ReadCallBack), request);
            }
            catch (Exception) { }
        }

        /// <summary>
        /// 执行回调时候异步最终拿到值
        /// 正常获取反馈值,异常时候值为 timeout
        /// </summary>
        public  string returnContent { get; set; }

        /// <summary>
        /// 执行异步回调请求
        /// </summary>
        /// <param name="asynchronousResult"></param>
        private  void ReadCallBack(IAsyncResult asynchronousResult)
        {
            try
            {
                HttpWebRequest reqeust = (HttpWebRequest)asynchronousResult.AsyncState;
                HttpWebResponse response = (HttpWebResponse)reqeust.EndGetResponse(asynchronousResult);
                StreamReader readContent = new StreamReader(response.GetResponseStream());
                returnContent = readContent.ReadToEnd().ToString();
                Reback(returnContent);
            }
            catch (Exception)
            {
                returnContent = "timeout";
            }
        }
        #endregion

js部分:

<OBJECT id="comActiveX" width="" height="" classid="CLSID:7b8bfbe3-7f62-47e0-919c-6aa2315e6db9">
</OBJECT>
<SCRIPT type="text/javascript">
    //var comActiveX;
    try {
        //comActiveX = new ActiveXObject("HttpAsy.CollectGood");
    } catch (e) {
    //    alert("没有注册好");
    }
    comActiveX.attachEvent("eventsGet",function(msg){alert(msg)})

    comActiveX.AsyncGet("http:/www.baidu.com",5);

当运行后就会 弹出 百度源代码

这就实现了异步回调

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索c#
, string
, httpwebrequest
, request
, c#获取js的返回值
, public
, url回调
, 回调函数 dll
, c# 回调方法问题
, dll 多线程 c#
, c# dll回调
, 回调c#
, c# dll 异常
void
c站、c语言、cf、ch、c罗,以便于您获取更多的相关知识。

时间: 2024-08-03 19:57:08

C# dll事件中如何执行Javascript的回调函数的相关文章

Leave事件中最后执行了Focus()后再次触发Leave事件是为什么呀?【在线等】

问题描述 Leave事件中最后执行了Focus()后再次触发Leave事件是为什么呀? 解决方案 解决方案二:因为你当前鼠标位置就是不在控件上啊执行了Focus,获得焦点,相当于鼠标进入了一次然后你鼠标在外面,马上又会触发离开解决方案三:比如这是控件A的Leave事件,当焦点离开的时候触发控件A的leave事件,在A控件的Leave事件中最后一行,我把焦点赋给了B控件,为什么会触发A控件的Leave事件呢??解决方案四:引用1楼Z65443344的回复: 因为你当前鼠标位置就是不在控件上啊执行了

告诉你什么是javascript的回调函数_基础知识

函数也是对象 想弄明白回调函数,首先的清楚地明白函数的规则.在javascript中,函数是比较奇怪的,但它确确实实是对象.确切地说,函数是用Function()构造函数创建的Function对象.Function对象包含一个字符串,字符串包含函数的javascript代码.假如你是从C语言或者java语言转过来的,这也许看起来很奇怪,代码怎么可能是字符串?但是对于javascript来说,这很平常.数据和代码之间的区别是很模糊的. //可以这样创建函数 var fn = new Functio

详解JavaScript的回调函数_javascript技巧

本文的目录: 什么是回调或高级函数 回调函数是如何实现的 实现回调函数的基本原则 回调地狱的问题和解决方案 实现自己的回调函数 在JavaScrip中,function是内置的类对象,也就是说它是一种类型的对象,可以和其它String.Array.Number.Object类的对象一样用于内置对象的管理.因为function实际上是一种对象,它可以"存储在变量中,通过参数传递给(别一个)函数(function),在函数内部创建,从函数中返回结果值". 因为function是内置对象,我

谈谈JavaScript自定义回调函数_javascript技巧

废话不多说了,直接给大家贴代码了. 背景分析 首先看一段js的代码,主要实现添加的时候首先通过异步请求判断是否存在,如果不存在的话,在进行添加操作: function add(url,data) { var isExited = isExited(data); if(!isExited){ addRequest(url, data); } } 当我添加一个数据的时候,我首先通过判断是否在数据库中存在(当然,如果前后台彻底分离的话,不应该前端进行业务逻辑的判断,前端只应该,用来展示数据),首先,i

c#委托和事件的具体使用,和回调函数该怎么用,哈希表是怎么回事?

问题描述 c#委托和事件的具体使用,和回调函数该怎么用,哈希表是怎么回事? c#委托和事件的具体使用,和回调函数该怎么用,哈希表是怎么回事? 解决方案 http://www.cnblogs.com/OpenCoder/archive/2009/09/23/1572646.htmlhttp://www.cnblogs.com/xpvincent/archive/2013/01/15/2860841.html 解决方案二: 你还是别问了,你好好看看msdn,或者自己网上查查,都能找到答案 解决方案三

javascript带回调函数的异步脚本载入方法实例分析

  本文实例讲述了javascript带回调函数的异步脚本载入方法.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 var Loader = function () { } Loader.prototype = { require: function (scripts, callback) { this.loadCount = 0; this.totalRequire

nodejs-NodeJS的回调函数中的变量怎么在回调函数外使用

问题描述 NodeJS的回调函数中的变量怎么在回调函数外使用 例如fs的readFile方法: fs.readFile(filename, [options], callback) 其中读取出来的数据是存在回调函数的参数data中,可是我想在回调函数外,使用读取出的数据,该怎么写? 我刚开始学,纯小白,各位大神写详细点儿,谢谢! 解决方案 用readFileSync同步读取,而不是异步,异步你只能讲需要使用数据的代码全部放入callback中 http://www.itxxz.com/a/gao

javascript带回调函数的异步脚本载入方法实例分析_javascript技巧

本文实例讲述了javascript带回调函数的异步脚本载入方法.分享给大家供大家参考.具体实现方法如下: var Loader = function () { } Loader.prototype = { require: function (scripts, callback) { this.loadCount = 0; this.totalRequired = scripts.length; this.callback = callback; for (var i = 0; i < scri

详解C#中通过委托来实现回调函数功能的方法_C#教程

委托(delegate)是一种可以把引用存储为函数的类型,这类似于c++中的函数指针. 回调函数c++中的回调函数,就是用函数指针来实现的.类似的,c#中用委托,来实现回调函数的功能. 回调函数为什么被称为回调函数?比如你调用了一个函数,那么就叫调用,但是如果你在调用一个函数的时候,还需要把一个函数提供给该函数,让这个函数来调用你的函数,那么你提供的这个函数就被称为回调函数(callback). 对于python这样的动态语言而言,就没有c#,c++提供特殊的语法实现回调函数,因为在python