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. 国产与第三方库FFmpeg SDK

    一个.编译并安装第三方库 1. libfaac # tar -zxvf faac-1.28.tar.gz # cd faac-1.28 # ./configure --prefix=/opt/YOUR ...

  2. HDU1068/POJ1466_Girls and Boys(二分图/最大独立集=N-最大匹配)

    解题报告 http://blog.csdn.net/juncoder/article/details/38160591 题目传送门(POJ) 题目传送门(HDU) 题意: 求满足条件的最大集合:集合内 ...

  3. python 时间处理

    在实践中,时间处理遇到的问题,需要 Sep 06, 2014 19:30 (UTC 时间) 和 比较当前时间,早晚.知道 此 2014-09-06 19:30 格时间表达式.因此,在处理,通缉 先将s ...

  4. codeforces 438D

    在大大推荐下这个标题不明的人做.而我的最后一个非常喜欢的段树,因此,愤怒出手.认为基本上相同.大值,当最大值小于取模时能够剪枝. 今后再遇到此类问题算是能攻克了 // file name: d.cpp ...

  5. HDU 1598 find the most comfortable road (最小生成树) &gt;&gt;

    Problem Description XX明星有许多城市,通过与一个陌生的城市高速公路SARS(Super Air Roam Structure---超级空中漫游结构)进行交流.每条SARS都对行驶 ...

  6. 经典算法题每日演练——第八题 AC自动机

    原文:经典算法题每日演练--第八题 AC自动机 上一篇我们说了单模式匹配算法KMP,现在我们有需求了,我要检查一篇文章中是否有某些敏感词,这其实就是多模式匹配的问题. 当然你也可以用KMP算法求出,那 ...

  7. oracle_解锁表_解锁用户

    1.解锁用户 以dba身份登录   sqlplus / as sysdba alter user scott account unlock; 2.解锁表 alter   system   kill   ...

  8. JavaScript 奇技淫巧

    JavaScript 奇技淫巧 这里记录一下以前学习各种书籍和文章里边出现的JS的小技巧,分享给大家,也供自己查阅,同时感谢那些发现创造和分享这些技巧的前辈和大牛们. 1.遍历一个obj的属性到数组 ...

  9. file 上传文件后缀名 限制

    比如: 要求只能上传Excel <input type="file" accept="application/vnd.ms-excel,application/vn ...

  10. MVC 6 写法

    MVC 6 一些不晓得的写法 今天在看 Scott Guthrie 的一篇博文<Introducing ASP.NET 5>,在 MVC 6 中,发现有些之前不晓得的写法,这边简单记录下, ...