Task的基本使用

这篇博客详细介绍了C#中Task的多种使用方式,包括直接实例化、Task.Factory.StartNew和Task.Run。还展示了如何进行异步HTTP请求,并在请求完成后更新UI,同时确保UI线程安全。文中提供了Task.RunSynchronously方法同步执行任务的示例,以及错误处理和回调更新UI的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

48303354

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值