当前位置:编程学习 > C#/ASP.NET >>

请教事件线程问题

这个很难说清,请高手耐心听小弟说,
 小弟的程序先要下载一个文件,把下载写在一个类(DownLoadclass)里边了,
 所以当下载完成后线程回到这个类里,在这个类里激发一个自定义的downloadcompleted事件,通知mainpage,
 在mainpage里有个函数(ParseData)使用刚刚下载的数据,在ParseData里要完成很多事情,但是ParseData一直是在事件的线程里,所以当这个函数要用到本地代码,比如修改UI的时候,就总是发生跨线程异常,当然这可以使用Dispatcher.BeginInvoke,
 但是因为在ParseData里还要再去下载,所以线程越来越多,但总是不能回到主线程,最终因为数据原因Dispatcher.BeginInvoke也搞不定了,请教高手,有什么好的布局,也就是说如何能在第一次下载后回到主线程对数据处理,而不是使用事件呼叫mainpage?
 
          以下是Download类中,在下载后的代码,
            try
             {
                 this.response = (result.AsyncState as HttpWebRequest).EndGetResponse(result) as HttpWebResponse;
                 using (System.IO.BinaryReader Stream = new System.IO.BinaryReader (this.response.GetResponseStream()))
                 {
                     this.dataBuffer = new byte[this.response.ContentLength];
                     Stream.Read(this.dataBuffer, 0, this.dataBuffer.Length);
                     Stream.Close();
                     this.response.Close(); }
                 if(!cancel)
                     DownLoadCompleted();//---------这里呼叫mainpage的ParseData,
                     //但是如果ParseData里要做很多事的画,代码就一直没有回归主线程,一直在事件处理线程里。
             } --------------------编程问答-------------------- 在主窗口类把一个对象传给DownLoadclass类或创建一个公共的静态值,给这个静态值赋上本身对象,以后直接可以用这个
FMain.BeginInvoke,就可以了 --------------------编程问答-------------------- 需要调用UI的地方你要定义定义一个Delegate,一个方法(你原来访问UI的内容)
然后假如价格delegate 是DelegateCall(string s),方法是Call(string s)
那么你需要回调UI的地方用FMain.Invoke(new DelegateCall(Call),new object[]{s});
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,