110,501
社区成员
发帖
与我相关
我的任务
分享
//委托
private delegate void DgtGetRequest(object web);
DgtGetRequest dgtrequest = new DgtGetRequest(GetHttp);
//点击按钮一时执行
hread th = new Thread(new ParameterizedThreadStart(ThreadGetResquest));
th.Start("https://www.baidu.com/");
//请求web,获得返回数据,显示在treeView1,
public void GetHttp(object web) {
WebRequest request = WebRequest.Create(((string)web));
WebResponse response = request.GetResponse();
string str = new StreamReader(response.GetResponseStream(), Encoding.UTF8).ReadToEnd();
treeView1.Nodes.Add(str);
}
Control.CheckForIllegalCrossThreadCalls = false;
//然后点击按钮时执行
Thread th = new Thread(new ParameterizedThreadStart(GetHttp));
th.Start("https://www.baidu.com/");
//执行到下面这句会报错
//在该控件上执行的操作正从错误的线程调用。
//使用 Control.Invoke 或 Control.BeginInvoke 封送到正确的线程才能执行此操作。
treeView1.Nodes.Add(str);
CookieContainer cookie = new CookieContainer();
Dictionary<string, string> parameters = new Dictionary<string, string>();
Dictionary<string, string> dics = new Dictionary<string, string>();
dics.Add("begintime", begintime.ToString("yyyy-MM-dd"));
dics.Add("endtime", endtime.ToString("yyyy-MM-dd"));
parameters.Add("json", JsonConvert.SerializeObject(dics).ToString());
var task1 = HttpHelper.CreatePostHttpResponse(System.Configuration.ConfigurationManager.AppSettings["GetWorkSationOrderAndCustomer"].ToString(), parameters,
"Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1.16) Gecko/20080702 Firefox/2.0.0.16",
Encoding.UTF8,
cookie);
var content = "";
allWorkSationOC.WorkSationOCInfos = new List<WorkSationOCInfo>();
using (Stream stream = task1.Result.GetResponseStream())
{
using (StreamReader sr = new StreamReader(stream))
{
content = sr.ReadToEnd();
allWorkSationOC.WorkSationOCInfos = JsonConvert.DeserializeObject<List<WorkSationOCInfo>>(content);
}
}
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
namespace ShiHang.Infrastructure
{
public class HttpHelper
{
private static readonly string DefaultUserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1.16) Gecko/20080702 Firefox/2.0.0.16";
/// <summary>
/// 创建POST方式的HTTP请求
/// </summary>
/// <param name="url">请求的URL</param>
/// <param name="parameters">随同请求POST的参数名称及参数值字典</param>
/// <param name="userAgent">请求的客户端浏览器信息,可以为空</param>
/// <param name="requestEncoding">发送HTTP请求时所用的编码</param>
/// <param name="cookies">随同HTTP请求发送的Cookie信息,如果不需要身份验证可以为空</param>
/// <returns></returns>
public static Task<WebResponse> CreatePostHttpResponse(string url, IDictionary<string, string> parameters, string userAgent, Encoding requestEncoding, CookieContainer cookieContainer)
{
if (string.IsNullOrEmpty(url))
{
throw new ArgumentNullException("url");
}
if (requestEncoding == null)
{
throw new ArgumentNullException("requestEncoding");
}
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
if (!string.IsNullOrEmpty(userAgent))
{
request.UserAgent = userAgent;
}
else
{
request.UserAgent = DefaultUserAgent;
}
if (cookieContainer == null)
{
request.CookieContainer = new CookieContainer();
}
else
{
request.CookieContainer = cookieContainer;
}
//如果需要POST数据
if (!(parameters == null || parameters.Count == 0))
{
StringBuilder buffer = new StringBuilder();
int i = 0;
foreach (string key in parameters.Keys)
{
if (i > 0)
{
buffer.AppendFormat("&{0}={1}", key, parameters[key]);
}
else
{
buffer.AppendFormat("{0}={1}", key, parameters[key]);
}
i++;
}
byte[] data = requestEncoding.GetBytes(buffer.ToString());
var task = Task.Factory.FromAsync<Stream>(request.BeginGetRequestStream, request.EndGetRequestStream, request, TaskCreationOptions.None); //等待任务完成
task.Wait(); //执行完本任务后再连续执行写入留和返回response对象 '
using (Stream stream = task.Result)//如果上面没有等待任务完成那一句,在这里直接获取结果也是可以的
{
stream.Write(data, 0, data.Length);
}
}
return Task.Factory.FromAsync<WebResponse>(request.BeginGetResponse, request.EndGetResponse, request, TaskCreationOptions.None);
}
/// <summary>
/// 创建GET方式的HTTP请求
/// </summary>
/// <param name="url">请求的URL</param>
/// <param name="timeout">请求的超时时间</param>
/// <param name="userAgent">请求的客户端浏览器信息,可以为空</param>
/// <param name="cookies">随同HTTP请求发送的Cookie信息,如果不需要身份验证可以为空</param>
/// <returns></returns>
public static Task<WebResponse> CreateGetHttpResponse(string url, string userAgent, CookieContainer cookieContainer)
{
if (string.IsNullOrEmpty(url))
{
throw new ArgumentNullException("url");
}
HttpWebRequest request = WebRequest.Create(new Uri(url)) as HttpWebRequest;
request.Method = "GET";
request.UserAgent = DefaultUserAgent;
if (!string.IsNullOrEmpty(userAgent))
{
request.UserAgent = userAgent;
}
if (cookieContainer == null)
{
request.CookieContainer = new CookieContainer();
}
else
{
request.CookieContainer = cookieContainer;
}
return Task.Factory.FromAsync<WebResponse>(request.BeginGetResponse, request.EndGetResponse, request, TaskCreationOptions.None);
}
}
}
配置
<system.net>
<connectionManagement>
<add address="*" maxconnection="512"/>
</connectionManagement>
<defaultProxy
enabled="false"
useDefaultCredentials="false" >
<proxy/>
<bypasslist/>
<module/>
</defaultProxy>
</system.net>
private void ThreadGetResquest(object hostIP)
{
for (int i = 0; i < 50; i++)
{
WebRequest request = WebRequest.Create(((string)hostIP));
WebResponse response = request.GetResponse();
Stream stream = response.GetResponseStream();
string str = new StreamReader(stream, Encoding.UTF8).ReadToEnd();
response.Close();
stream.Close();
dgtrequest = new DgtGetRequest(AddNode);
//this.Invoke(dgtrequest, str);
this.BeginInvoke(dgtrequest, str);
}
}
public void AddNode(object web)
{
textBox1.Text = web.ToString();
treeView1.Nodes.Add(web.ToString());
}
不是绑定数据到treeview的问题,是执行GetHttp 方法的时候winfrom界面会卡,
使用后面非安全线程Control.CheckForIllegalCrossThreadCalls = false;
界面不会卡,但是绑定数据会报错public void GetHttp(object web)
{
WebRequest request = WebRequest.Create(((string)web));
WebResponse response = request.GetResponse();
string str = new StreamReader(response.GetResponseStream(), Encoding.UTF8).ReadToEnd();
this.BeginInvoke((Action)delegate
{
treeView1.Nodes.Add(str);
});
}
private void ThreadGetResquest(object web)
{
ThreadPool.QueueUserWorkItem(GetHttp, web);
}
private void ThreadGetResquest(object web)
{
this.Invoke(dgtrequest, web);
}