.Net(C#)实现异步编程

本文介绍了如何利用C#的BackgroudWorker和Task来解决异步编程中遇到的UI卡死及HTTP请求并发问题。通过BackgroudWorker组件避免UI线程阻塞,提高用户体验,同时使用Task实现HTTP请求的并发处理,降低时间复杂度。
摘要由CSDN通过智能技术生成

最近编写了一个检查服务器集群的客户端程序,用于检查API接口是否可用,由于当时没有使用多线程技术,所有操作均在主进程中执行,这样就导致了2个问题:

1)由于要发送HTTP请求,导致主进程无响应,UI卡死

2)使用循环轮询集群的服务器列表,逐个请求发送到服务器,时间复杂度为O(n)

如果解决这2个问题:

1.使用BackgroudWork解决UI卡死的问题

            HostRequest hostRequest = new HostRequest(this._uri, this._hostConfig);
            using (BackgroundWorker bw = new BackgroundWorker())
            {
                bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(delegate {
                    this.dataGridView1.DataSource = this._dt;
                }); //设置任务结束后的回调函数
                bw.DoWork += new DoWorkEventHandler(delegate {
                    this._dt = hostRequest.Run();
                });//设置需要执行的任务
                bw.RunWorkerAsync();
            }  

2.使用Task解决HTTP请求并发的问题

            IList<Task<HostRequestResult>> list_task = new List<Task<HostRequestResult>>();
            foreach (string ip in this._hostConfig.GetIPList())
            {
                Task<HostRequestResult> t = new Task<HostRequestResult>(delegate
                {
                    return HostRequest.HttpRequest(this._uri, ip, this._hostConfig.Cookie, this._hostConfig.Timeout);
                }, TaskCreationOptions.AttachedToParent);//添加一个任务
                list_task.Add(t);
                t.Start();//启动任务
            }
            Task.WaitAll(list_task.ToArray<Task>());//这个操作是阻塞的,要等所有任务执行结束后,才会进行下一个语句
            foreach (Task<HostRequestResult> t_result in list_task)
            {

            }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值