文档章节

wpf 辅助线程与窗体线程交互数据与webservice服务的异步调用

温暖的小明
 温暖的小明
发布于 2016/10/26 16:27
字数 755
阅读 88
收藏 1

近期做了两个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系统原理第六版,第一章基本上讲的是微机原理里的东西,日益发现自己的基础薄弱.大学时学习的微机原理基本已经忘光光.年龄越来越大,真怀念高中时的记忆力.

© 著作权归作者所有

温暖的小明
粉丝 4
博文 21
码字总数 7472
作品 0
程序员
私信 提问
异步备份和还原数据库:.NET发现之旅(六)

信息系统是数据密集型的,数据的套帐,备份,还原是客户最希望有的功能,这一节课就讨论下C/S系统下数据库的异步备份和还原,B/S系统的数据备份和还原和这个类似。 既然是异步,首先会想到使...

terryli
2010/06/18
0
0
一位牛人的多线程和异步调用文章

转自小顾问原文 一位牛人的多线程和异步调用文章 首先申明:这篇文章不是我写的,我看到的一位牛人的,自己慢慢的消化了…… 摘要:本章讨论与智能客户端应用程序中多线程的使用有关的问题。...

橘子红了呐
2017/11/13
0
0
WPF快速指导12: 线程处理模型

WPF快速指导12: 线程处理模型 本文摘要: 1:理解与UI相关的多线程操作; 2:多个窗口多个线程 3:WPF中的多线程异常 1:理解与UI相关的多线程操作 首先来说说传统Winform。我们知道传统Win...

文艺小青年
2017/06/01
0
0
WPF 利用子线程弹出子窗体的研究

原文:WPF 利用子线程弹出子窗体的研究   一般来说子线程都是用来处理数据的,主窗体用来实现展现,但是有些时候我们希望子窗体实现等待效果,遮挡主窗体并使主窗体逻辑正常进行,这个业务需...

杰克.陈
2017/12/25
0
0
异常处理之ThreadException、unhandledException及多线程异常处理

异常处理之ThreadException、unhandledException及多线程异常处理 一:ThreadException和unhandledException的区别 处理未捕获的异常是每个应用程序起码有的功能,C#在AppDomain提供了Unhan...

文艺小青年
2017/04/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

如何远程调试部署在CloudFoundry平台上的nodejs应用

网络上关于如何本地调试nodejs应用的教程已经很多了,工具有Chrome开发者工具,Visual Studio Code,和nodejs周边的一些小工具等等。 在实际情况中,我们可能遇到本地运行良好,但是部署到C...

JerryWang_SAP
31分钟前
5
0
微信扫码访问网站调用默认浏览器打开如何实现?

我们在微信内分享链接或二维码的时候,我们会发现我们的网站是可以在浏览器里正常打开的,但就是不能在微信里打开,提示 “ 已停止访问该网页 ”,无论是聊天框也一样。说是系统检测到您的网...

明尼苏达哈士奇
39分钟前
3
0
一份Java程序员进阶架构师的秘籍,你离架构师还差多远

一、如何定义架构师 Java架构师,首先要是一个Java程序员,熟练使用各种框架,并知道它们实现的原理。jvm虚拟机原理、调优,懂得jvm能让你写出性能更好的代码;池技术,什么对象池,怎么解决并...

我最喜欢三大框架
47分钟前
2
0
想说再见不容易,win7最新市占率依然超36%

微软正在通过努力让Windows 7用户升级至Windows 10,不过从目前的市占率来看,他们还是要加把劲了。 据最新的市场份额看,Windows 10在本月的市场份额有所提升,从43.62%增长到44.10%。另一...

linuxCool
58分钟前
6
0
SQL的优化

对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 对查询进行优化,要尽量避免全表扫描,首先应考虑在进行条件判断的字段上创建了索引。 应尽量避...

咸鱼-李y
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部