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. lol盒子重点内容

    //AFN函数 - imageview载入网络图片而且获取图片,获取之后存储到手机   [image setImageWithURLRequest:[NSURLRequest requestWithU ...

  2. JavaEE(16) - JPA生命周期及监听器

    1. 理解实体的生命周期 2. 为实体生命周期事件定义监听器 3. 通过监听实现回调 4. 排除默认监听器和父类上定义的监听器 1. 理解实体的生命周期(Net Beans创建Java Project ...

  3. linux内核包转发过程(三)NIC帧接收分析

    [版权声明:转载请保留源:blog.csdn.net/gentleliu.邮箱:shallnew*163.com] 每一个cpu都有队列来处理接收到的帧.都有其数据结构来处理入口和出口流量,因此.不同 ...

  4. Oracle 11g+oracle客户端(32位)+PL/SQL develepment的安装配置

    之前一直想学Oracle,可是就是安装配置Oracle一直未成功,让人很苦恼,特别是什么监听器什么的,一直没搞明白,弄了整整一天都没弄出来,上网查资料后发现资料上大多数都是参差不齐,不太详细明了,尝试 ...

  5. jquery字体更改后的鼠标-影像学改变//凝视内容

    <!doctype html> <html> <head> <meta charset="gb2312"> <title> ...

  6. 它可以作为一个代理server或者转发java类

    在项目中使用,这简化和通用汽车.突出的基本思路,细节可以基于此类改变. 基于java容器和servlet. package com.xxx.first; import java.io.Buffered ...

  7. Stopwatch计时器、秒表 C#

    .NET2.0也提供了这样一个秒表:Stopwatch类,它可以比较精确地测量时间. 速度测试: 软件的性能和可测性是一个复杂的主题.要确保应用程序能够满足用户的期望,就需要在开发周期内考虑它的性能和 ...

  8. 【Flume NG用户指南】(2)构造

    作者:周邦涛(Timen) Email:zhoubangtao@gmail.com 转载请注明出处:  http://blog.csdn.net/zhoubangtao/article/details ...

  9. SQL Prompt5 破解版+使用说明 [转]

    SQL脚本越写越多,总是觉得编写效率太过于低下,这和打字速度无关.在我个人编写SQL脚本时,至少会把SQL的格式排列成易于阅读的,因为其他人会阅读到你的SQL,无论是在程序中或是脚本文件中,良好的排版 ...

  10. 使用Heartbeat实现双机热备

    使用Heartbeat实现"双机热备"或者称为"双机互备"heartbeat的工作原理:heartbeat最核心的包含两个部分,心跳监測部分和资源接管部分,心跳 ...