C# dll 事件执行 js 回调函数

 

前言:

  由于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>
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 eventsGet(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>
/// <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);

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

这就实现了异步回调

http://files.cnblogs.com/echosong/http.rar 完整demo下载(先点reg.bat先注册dll)

C# dll 事件执行 js 回调函数的更多相关文章

  1. 脚本加载后执行JS回调函数的方法

    动态脚本简单示例 // IE下: var HEAD = document.getElementsByTagName('head')[0] || document.documentElement var ...

  2. 小兔JS教程(三)-- 彻底攻略JS回调函数

    这一讲来谈谈回调函数. 其实一句话就能概括这个东西: 回调函数就是把一个函数当做参数,传入另一个函数中.传进去的目的仅仅是为了在某个时刻去执行它. 如果不执行,那么你传一个函数进去干嘛呢? 就比如说对 ...

  3. JS回调函数全解析教程

    转自:http://blog.csdn.net/lulei9876/article/details/8494337 自学jQuery的时候,看到一英文词(Callback),顿时背部隐隐冒冷汗.迅速g ...

  4. 如何理解JS回调函数

    1.回调函数英文解释: A callback is a function that is passed as an argument to another function and is execut ...

  5. js回调函数(callback)理解

    Mark! js学习 不喜欢js,但是喜欢jquery,不解释. 自学jquery的时候,看到一英文词(Callback),顿时背部隐隐冒冷汗.迅速google之,发现原来中文翻译成回调.也就是回调函 ...

  6. js回调函数

    自学jQuery的时候,看到一英文词(Callback),顿时背部隐隐冒冷汗.迅速google之,发现原来中文翻译成回调.也就是回调函数了.不懂啊,于是在google回调函数,发现网上的中文解释实在是 ...

  7. JS回调函数的使用和作用

    <html> <head> <title>回调函数(callback)</title> <script language="javasc ...

  8. Node.js 回调函数

    Node.js 回调函数 Node.js 异步编程的直接体现就是回调. 异步编程依托于回调来实现,但不能说使用了回调后程序就异步化了. 回调函数在完成任务后就会被调用,Node 使用了大量的回调函数, ...

  9. JS回调函数--简单易懂有实例

    版权声明:本文为博主原创文章,转载请注明出处 初学js的时候,被回调函数搞得很晕,现在回过头来总结一下什么是回调函数. 我们先来看看回调的英文定义:A callback is a function t ...

随机推荐

  1. .NET开发者必备的11款免费工具

    原文:.NET开发者必备的11款免费工具 如今,HTML5,jQuery,JavaScript等等这些热门技术,受到了开发者们的强烈追捧,有了这些开发工具也为开发者们减轻了许多负担.本文为开发者介绍了 ...

  2. 自己动手写CPU 笔记

    自己动手写CPU 跳转至: 导航. 搜索 文件夹 1 处理器与MIPS 2 可编程逻辑器件与Verilog HDL 3 教学版OpenMIPS处理器蓝图 4 第一条指令ori 5 逻辑.移位与nop ...

  3. 微信QQ的二维码登录原理浅析

    在非常多地方就是都出现了使用二维码登录,二维码付款,二维码账户等应用(这里的二维码种马,诈骗就不说了),二维码验证,多终端辅助授权应用開始多起来,这里先说下啥是二维码,事实上二维码就是存了二进制数据的 ...

  4. SAE+Java+jetty

    SAE的java执行环境jetty如servlet该容器,和开放几乎完全访问.有效支持各种jar包.但对于jdk的要件的版本号是非常严格格,这里的版本号是jdk1.6 SAE利用上传war该方式配置j ...

  5. Javascript学习2 - Javascript中的表达式和运算符

    原文:Javascript学习2 - Javascript中的表达式和运算符 Javascript中的运算符与C/C++中的运算符相似,但有几处不同的地方,相对于C/C++,也增加了几个不同的运算符, ...

  6. 动态传递参数到DevExpress.XtraReports的小结

    原文:动态传递参数到DevExpress.XtraReports的小结 前两种方法和WinForm一样,可以传递参数.数组.实体对象.DataTable等1. 采用构造函数具体用法:在Report中p ...

  7. Android JNI环境要SQLite加密模块简介

    免费的SQLite开源源代码仅仅给提供了两个函数,仅仅有实现这两个函数才干实现数据库总体加密. 然后废了点劲从网上找了一个已经实现好的开源库http://sourceforge.net/project ...

  8. JAVA8,SPRING,ANGULARJS对项目

    java8+spring+angularjs 项目应用 最近有写一个电子订单商务网站,使用JAVA8,SPRING,ANGULARJS对项目使用的技术和大家分享. 第一次写博客,哪有不对需要改正的请联 ...

  9. 经典算法题每日演练——第十六题 Kruskal算法

    原文:经典算法题每日演练--第十六题 Kruskal算法 这篇我们看看第二种生成树的Kruskal算法,这个算法的魅力在于我们可以打一下算法和数据结构的组合拳,很有意思的. 一:思想 若存在M={0, ...

  10. linux_无密登录

    使用下例中ssky-keygen和ssh-copy-id,仅需通过3个步骤的简单设置而无需输入密码就能登录远程Linux主机. ssh-keygen 创建公钥和密钥. ssh-copy-id 把本地主 ...