由于项目需要一个读写IC卡的功能故要做一个ActiveX嵌入网页供客户使用,其实之前已经交付给客户使用了,不过近期由于功能变动,需要添加一些其他功能。现在遇到了一个在多线程下回调页面JS的问题:在页面通过JS调用ActiveX里面的一个多线程方法,等处理完得到结果后回调页面JS。但是通过测试发现在不用多线程的情况下,可以正常回调页面JS,一旦开启多线程就无法正常回调页面JS。
经调试发现,在页面调用ActiveX方法的时候,传进来的HTMLWindow2出现异常:注:由于是在之前代码的基础上做的修改故不存在ActiveX有问题的情况。
话不多说,上代码:using mshtml;        
HTMLWindow2 html = null;
CmdControl cmd = null;
Thread work = null;
string JsName = string.Empty;
        public class1()
        {
            cmd = new CmdControl();
            cmd.EvtResult += new DltResultCallBack(CallBack);
        }
        public void GetInfo(object obj, string jsname)
        {
            work = new Thread(new ThreadStart(() =>
            {
                html = (HTMLWindow2)obj;
                JsName = jsname;
                cmd.GetUserInfo(out hr);
            }));
            work.Start();
        }
        //这里得到多线程处理后的结果
        private void CallBack(string result)
        {
           if (html != null)
           {
               string a = string.Format("{0}('{1}')", JsName, result);
               html.execScript(a, "javascript");
           }
        }刚刚接触用C#写ActiveX,很多问题需要请教各位大大指点C#activex多线程JavaScript

解决方案 »

  1.   

    果然靠谱啊将委托放在主线程里就一切OK了        public void GetInfo(object obj, string jsname)
            {
                html = (HTMLWindow2)obj;
                JsName = jsname;
                work = new Thread(new ThreadStart(() =>
                {
                    cmd.GetUserInfo(out hr);
                }));
                work.Start();
            }
            //这里得到多线程处理后的结果
            private void CallBack(string result)
            {
                this.BeginInvoke(new EventHandler((obj, es) =>
                {
                    if (html != null)
                    {
                        string a = string.Format("{0}('{1}')", JsName, result);
                        html.execScript(a, "javascript");
                    }
                }));
            }
      

  2.   

    果然靠谱啊将委托放在主线程里就一切OK了        public void GetInfo(object obj, string jsname)
            {
                html = (HTMLWindow2)obj;
                JsName = jsname;
                work = new Thread(new ThreadStart(() =>
                {
                    cmd.GetUserInfo(out hr);
                }));
                work.Start();
            }
            //这里得到多线程处理后的结果
            private void CallBack(string result)
            {
                this.BeginInvoke(new EventHandler((obj, es) =>
                {
                    if (html != null)
                    {
                        string a = string.Format("{0}('{1}')", JsName, result);
                        html.execScript(a, "javascript");
                    }
                }));
            }

    你好,我遇到了和你相同的问题,请问你是如何在主线程触发事件的,你上面的代码我看的不是很懂。
    我在控件初始化的时候,创建了一个线程,这个线程一直循环的和其他进程的应用进行通信,当收到数据
    后,我就会触发事件,告诉JS消息到达了。
    如果我要在收到消息后,让主线程触发事件的话,我该怎么做呢?谢谢了。