在学习WebRequest Web Response对header操作时,涉及到异步操作,按实例运行出错,vs2005提示“how to make cross-thread calls...”,查了一下资料。将原来的代码
using System; using System.IO; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Net; namespace Accessing_the_internet { publicpartialclass Form1 : Form { public Form1() { InitializeComponent(); WebRequest wrq = WebRequest.Create("http://www.123de6.cn"); wrq.BeginGetResponse(new AsyncCallback(OnResponse), wrq); } protectedvoid OnResponse(IAsyncResult ar) { WebRequest wrq=(WebRequest)ar.AsyncState; WebResponse wrs=wrq.EndGetResponse(ar); //read the response WebHeaderCollection whc = wrs.Headers; MethodInvoker mi=new MethodInvoker() for (int i =0; i < whc.Count; i++) { listBox1.Items.Add("Header"+ whc.GetKey(i)+" : "+whc[i]); } } } }
改为这样,就可以实现对主线程listbox的操作。
using System; using System.IO; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Net; namespace Accessing_the_internet { publicpartialclass Form1 : Form { WebHeaderCollection whc; public Form1() { InitializeComponent(); WebRequest wrq = WebRequest.Create("http://www.123de6.cn"); wrq.BeginGetResponse(new AsyncCallback(OnResponse), wrq); } protectedvoid OnResponse(IAsyncResult ar) { WebRequest wrq=(WebRequest)ar.AsyncState; WebResponse wrs=wrq.EndGetResponse(ar); //read the response whc = wrs.Headers; MethodInvoker mi =new MethodInvoker(controla); this.BeginInvoke(mi); } privatevoid controla() { for (int i =0; i < whc.Count; i++) { listBox1.Items.Add("Header"+ whc.GetKey(i) +" : "+ whc[i]); } } } }