Task的基本使用
//1.new方式实例化一个Task,需要通过Start方法启动
Task<string> task = new Task<string>(() =>
{
return $"hello, task1的ID为{Thread.CurrentThread.ManagedThreadId}";
});
task.Start();
// 2.Task.Factory.StartNew(Func func)创建和启动一个Task
Task<string> task2 = Task.Factory.StartNew<string>(() =>
{
return $"hello, task2的ID为{ Thread.CurrentThread.ManagedThreadId}";
});
//3.Task.Run(Func func)将任务放在线程池队列,返回并启动一个Task
Task<string> task3 = Task.Run<string>(() =>
{
return $"hello, task3的ID为{ Thread.CurrentThread.ManagedThreadId}";
});
Task task4 = new Task(() =>
{
Thread.Sleep(100);
textBox1.Text += "执行Task4结束!" + "\r\n";
});
//同步执行,task会阻塞主线程
task4.RunSynchronously();
string aaa = task2.Result;
//方式5(这种方法会错乱)
//tasklist.Add(taskFactory.StartNew(() =>
//{
// GetYongqiu(strLjbh_n, strLjbh_w);
//}));
Task 异步请求http
public static async Task<string> GetHttpPostStringAsync(string url, string req)
{
return await Task.Run(() =>
{
return Http_Post(url, req);
});
}
public static string Http_Post(string url, string requestBody)
{
try
{
//设置支持的ssl协议版本,这里我们都勾选上常用的几个
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 | (SecurityProtocolType)3072;
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
request.ContentType = "application/soap+xml;";
string authorization = "xx" + ":" + "xx";//BYD接口的用户名和密码
string base64 = Convert.ToBase64String(Encoding.Default.GetBytes(authorization));
request.Headers.Add("Authorization", "Basic " + base64);//basic验证
request.CookieContainer = cookieContainer;
using (var streamWriter = new StreamWriter(request.GetRequestStream()))
{
streamWriter.Write(requestBody);
streamWriter.Flush();
streamWriter.Close();
}
HttpWebResponse httpResponse;
try
{
httpResponse = (HttpWebResponse)request.GetResponse();
using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
var result = streamReader.ReadToEnd();
return result;
}
}
catch (WebException ex)
{
httpResponse = (HttpWebResponse)ex.Response;
using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
var result = streamReader.ReadToEnd();
string value = Prase_error(result);
MessageBox.Show(value,"错误提示",MessageBoxButtons.OK,MessageBoxIcon.Error);
str_errmsg = value;
return "";
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "错误提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
str_errmsg = ex.Message;
return "";
}
}
Task 异步回调更新UI
private void button3_Click(object sender, EventArgs e)
{
string req_url_add = "https://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
//异步回调, 方法1 重点:TaskScheduler.FromCurrentSynchronizationContext()
//Task<string> waitT = Task.Factory.StartNew(() =>
//{
// return httphelper.Http_Get(req_url_add);
//});
//waitT.ContinueWith(antecendent =>
//{
// //将内容传写到TextBox上
// textBox1.Text = antecendent.Result;
//}, TaskScheduler.FromCurrentSynchronizationContext());
//方法2 重点:TaskScheduler.FromCurrentSynchronizationContext()
Task.Run(() =>
{
return httphelper.Http_Get(req_url_add);
}).ContinueWith(t =>
{
textBox1.Text = t.Result;
}, TaskScheduler.FromCurrentSynchronizationContext());
//同步方法
//res = httphelper.Http_Get(req_url_add);
//textBox1.Text = res;
}