C# dll 事件执行 js 回调函数
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 回调函数的更多相关文章
- 脚本加载后执行JS回调函数的方法
动态脚本简单示例 // IE下: var HEAD = document.getElementsByTagName('head')[0] || document.documentElement var ...
- 小兔JS教程(三)-- 彻底攻略JS回调函数
这一讲来谈谈回调函数. 其实一句话就能概括这个东西: 回调函数就是把一个函数当做参数,传入另一个函数中.传进去的目的仅仅是为了在某个时刻去执行它. 如果不执行,那么你传一个函数进去干嘛呢? 就比如说对 ...
- JS回调函数全解析教程
转自:http://blog.csdn.net/lulei9876/article/details/8494337 自学jQuery的时候,看到一英文词(Callback),顿时背部隐隐冒冷汗.迅速g ...
- 如何理解JS回调函数
1.回调函数英文解释: A callback is a function that is passed as an argument to another function and is execut ...
- js回调函数(callback)理解
Mark! js学习 不喜欢js,但是喜欢jquery,不解释. 自学jquery的时候,看到一英文词(Callback),顿时背部隐隐冒冷汗.迅速google之,发现原来中文翻译成回调.也就是回调函 ...
- js回调函数
自学jQuery的时候,看到一英文词(Callback),顿时背部隐隐冒冷汗.迅速google之,发现原来中文翻译成回调.也就是回调函数了.不懂啊,于是在google回调函数,发现网上的中文解释实在是 ...
- JS回调函数的使用和作用
<html> <head> <title>回调函数(callback)</title> <script language="javasc ...
- Node.js 回调函数
Node.js 回调函数 Node.js 异步编程的直接体现就是回调. 异步编程依托于回调来实现,但不能说使用了回调后程序就异步化了. 回调函数在完成任务后就会被调用,Node 使用了大量的回调函数, ...
- JS回调函数--简单易懂有实例
版权声明:本文为博主原创文章,转载请注明出处 初学js的时候,被回调函数搞得很晕,现在回过头来总结一下什么是回调函数. 我们先来看看回调的英文定义:A callback is a function t ...
随机推荐
- ElasticSearch实战
ElasticSearch实战-入门 1.概述 今天接着<ElasticSearch实战-日志监控平台>一文来给大家分享后续的学习,在<ElasticSearch实战-日志监控平台& ...
- [Android 4.4.3] 泛泰A870 Mokee4.4.3 20140610 RC2.0 通过刷第三版 by syhost
欢迎关注泛泰非盈利专业第三方开发团队 VegaDevTeam (本team 由 syhost suky zhaochengw(z大) xuefy(大星星) tenfar(R大师) loogeo cr ...
- Python输出文件由线解释和扩展的具体内容
结束此处的测试代码中作者写的,第一段包含不正确的版本号,后者是正确的版本号: #! /usr/bin/python2.7 try: filename = raw_input('please i ...
- EasyUI 扩展自己定义EasyUI校验规则 验证规则(经常使用的)
比如 校验输入框仅仅能录入0-1000之间 最多有2位小数的数字 表单<input type="text" id="rate" name="ra ...
- SQL字符串转换为数组
/*一.按指定符号分割字符串,返回分割后的元素个数,方法很简单,就是看字符串中存在多少个分隔符号,然后再加一,就是要求的结果. -----rtrim(@str)去掉 @str右边的字符 ltrim(@ ...
- C#关于图片的相关处理
public class ImageHelper { /// <summary> /// 图片转换成字节流 /// </summary> /// <param name= ...
- Ubuntu下一个openldapserver部署步骤
1:安装zlib 下载zlib-1.2.3.tar.gz(或其它版本号) wget http://down1.chinaunix.net/distfiles/zlib-1.2.3.tar.gz # . ...
- CodeForces 14 E - Camels && D - Two Paths
D - Two paths 仅仅想到了一个o(n^2)的解法. 首先枚举删除一条边,必定得到两棵独立的树.计算两棵树的直径.保留最大乘积. 首先两条路不相交,则必定能够分到两棵子树中,由于要乘积最大, ...
- 01. SQL Server 如何读写数据
原文:01. SQL Server 如何读写数据 一. 数据读写流程简要SQL Server作为一个关系型数据库,自然也维持了事务的ACID特性,数据库的读写冲突由事务隔离级别控制.无论有没有显示开启 ...
- Linux进程和线程的比較
进程与线程 參考:http://www.cnblogs.com/blueclue/archive/2010/07/16/1778855.html 首先比較Linux进程和线程的创建的差别,以此展开: ...