博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
wpf 辅助线程与窗体线程交互数据与webservice服务的异步调用
阅读量:5901 次
发布时间:2019-06-19

本文共 3146 字,大约阅读时间需要 10 分钟。

hot3.png

近期做了两个wpf项目,虽然wpf同属于c#语言,但是并没有系统性的学习过,基本上都是在开发过程中遇到问题然后百度.虽然也学习到了一些知识,但是太过碎片,脑海中细细一想并没有一个清晰的知识画面.因此在这里做一个总结.

    1.辅助线程与窗体线程交互数据问题.wpf中辅助线程没有权限与窗体进行交互,因此我们需要通过wpf中提供的Dispach.Invoke函数把辅助线程提供的数据绑定到窗体中.invoke函数的第一个参数是一个delegate,第二个是objects[],对应delegate绑定的函数的参数个数.

        示例:(未给出线程创建部分,ThreadForShowSource函数是绑定到线程的函数)

        private delegate void ReadToForm(localhost.ReadAndWriteModel model);

        private localhost.ReadAndWriteModel ModelToSource(localhost.DataModel model)

        {
            localhost.PacketsService ps = new localhost.PacketsService();
            return ps.GetReadAndWriteModel(model, ComString);
        }
        private void ThreadForShowSource()
        {
            ReadToForm myinvoke = new ReadToForm(SourceToForm);
            while (true)
            {
                localhost.DataModel model = new localhost.DataModel();
                model.Order = localhost.OrderEnum.高精度读;
                model.DevNum = 0;
                localhost.ReadAndWriteModel newmodel = ModelToSource(model);
                readAndWriteModel = newmodel;
                this.Dispatcher.Invoke(myinvoke, newmodel);
                Thread.Sleep(new TimeSpan(0, 0, 10));
            }
        }
        private void SourceToForm(localhost.ReadAndWriteModel newmodel)
        {
            if (newmodel != null && newmodel.Order == localhost.OrderEnum.高精度读)
            {
                Text_VoltageA.Text = newmodel.VoltageA.ToString("F2");
                Text_VoltageB.Text = newmodel.VoltageB.ToString("F2");
                Text_VoltageC.Text = newmodel.VoltageC.ToString("F2");
                Text_CurrentA.Text = newmodel.CurrentA.ToString("F2");
                Text_CurrentB.Text = newmodel.CurrentB.ToString("F2");
                Text_CurrentC.Text = newmodel.CurrentC.ToString("F2"); 
                if (newmodel.VoltageA == 0 && newmodel.VoltageB == 0 && newmodel.VoltageC == 0 && newmodel.CurrentA == 0 && newmodel.CurrentB == 0 && newmodel.CurrentC == 0)
                {
                    Text_Frequent.Text = "0.00";
                    Text_Phrase.Text = "0.00";
                }
                else
                {
                    Text_Frequent.Text = "50.00";
                    Text_Phrase.Text = newmodel.PhaseIA.ToString("F2");
                }
            }
        }

        2.webservice服务的异步调用.涉及到与服务进行交互,尤其是有数据回传时,采用异步调用的方式可以解决窗体假死的问题.服务的异步调用,分为两步,第一,绑定把异步调用完成处理函数绑定到异步调用完成事件上,第二,异步调用服务函数.

    示例:

         private void EmergencyClose(object sender, RoutedEventArgs e)

        {
            MessageText.Text = "正在尝试解除告警.时间:" + DateTime.Now.ToString();
            localhost.PacketsService ps = new localhost.PacketsService();
            localhost.DataModel model = new localhost.DataModel();
            model.DevNum = 0;
            model.Order = localhost.OrderEnum.告警解除;
            ps.GetReplyModelCompleted += new localhost.GetReplyModelCompletedEventHandler(EmergencyCloseCompleted);//绑定异步完成处理函数
            ps.GetReplyModelAsync(model, ComString);//异步调用
            
        }
        private void EmergencyCloseCompleted(object o, localhost.GetReplyModelCompletedEventArgs e)
        {
            if (e.Error != null)
            {
                MessageBox.Show("发生错误:" + e.Error.Message);
                MessageText.Text = "告警解除失败,发生错误.请重新操作.时间:" + DateTime.Now.ToString();
            }
            else
            {
                localhost.ReplyModel rmodel = e.Result as localhost.ReplyModel;
                if (rmodel != null && rmodel.Order == localhost.OrderEnum.确认应答)
                {
                    MessageText.Text = "告警解除成功.时间:" + DateTime.Now.ToString();
                    localhost.PacketsService ps = new localhost.PacketsService();
                    ps.RemoveEmergencyAsync(ComString);
                }
                else
                {
                    MessageBox.Show("源解除告警失败!");
                    MessageText.Text = "告警解除失败,发生错误.请重新操作.时间:" + DateTime.Now.ToString();
                }
            }
        }

    总结:对于这些分散的知识点,目前还没有找到合适的学习方法进行学习,只能通过写写总结来进行学习.今天读了windows系统原理第六版,第一章基本上讲的是微机原理里的东西,日益发现自己的基础薄弱.大学时学习的微机原理基本已经忘光光.年龄越来越大,真怀念高中时的记忆力.

转载于:https://my.oschina.net/u/2551141/blog/776069

你可能感兴趣的文章
javascript继承方式详解
查看>>
lnmp环境搭建
查看>>
自定义session扫描器精确控制session销毁时间--学习笔记
查看>>
PHP队列的实现
查看>>
单点登录加验证码例子
查看>>
[T-SQL]从变量与数据类型说起
查看>>
occActiveX - ActiveX with OpenCASCADE
查看>>
BeanUtils\DBUtils
查看>>
python模块--os模块
查看>>
Java 数组在内存中的结构
查看>>
《关爱码农成长计划》第一期报告
查看>>
学习进度表 04
查看>>
谈谈javascript中的prototype与继承
查看>>
时序约束优先级_Vivado工程经验与各种时序约束技巧分享
查看>>
minio 并发数_MinIO 参数解析与限制
查看>>
flash back mysql_mysqlbinlog flashback 使用最佳实践
查看>>
mysql存储引擎模式_MySQL存储引擎
查看>>
python类 del_全面了解Python类的内置方法
查看>>
java 重写system.out_重写System.out.println(String x)方法
查看>>
配置ORACLE 11g绿色版客户端和PLSQL远程连接环境
查看>>