C#.网络编程 Socket基础(七)MainWindow与Page之间传递消息。调用线程必须为STA、UI更新、卡顿。线程启动。Object类型作形参传递。单实例类+委托。

一、简介

1、本次主要介绍MainWindow窗口实例化,将MainWindow窗口实例化作为一个参数传输给另外一个窗体,以便给另外一个窗体使用。其保证了每个窗体只有一份实例化的数据。具有应用在,窗体与窗体间控件、数据的访问。关于每个窗体只进行一次实例化,得到一份数据,保证了数据的唯一性问题,将在后面给出阐述。

2、关于  “调用线程必须为STA,因为许多UI组件都需要” 问题、 UI更新问题、卡顿问题。你必须先了解这博客:

C#.网络编程 Socket基础(六)WPF工程 UI界面卡顿问题及其解决办法、UI界面没有卡顿,第二次实例化导致UI界面不能更新界面问题及其解决办法

3、我之前写的一些Socket的内容,可以给大家参考参考。这些内容也包含了UI更新、卡顿等等问题

C#.网络编程 Socket基础(一)Socket TCP协议 控制台 实现端到端(服务器与客户端)简单字符串通信

 C#.网络编程 Socket基础(二) 基于WinForm系统Socket TCP协议 实现端到端(服务器与客户端)图片传输

C#.网络编程 Socket基础(三) 基于WinForm系统Socket TCP协议 实现端到端(服务器与客户端).txt.word.png等不同类型文件传输

C#.网络编程 Socket基础(四) WPF系统Socket TCP协议 服务器与客户端 不同类型文件传输,解决UI线程(异步委托)与工作线程的卡顿问题

C#.网络编程 Socket基础(五) WPF系统Socket TCP协议 服务器与客户端 可以传输任何文件以及文件名、文件类型。

 C#.网络编程 Socket基础(六)WPF工程 UI界面卡顿问题及其解决办法、UI界面没有卡顿,第二次实例化导致UI界面不能更新界面问题及其解决办法

二、首先,先了解MainWindow.xaml窗口UI更新问题

问题:MainWindow.xaml对应的MainWindow.xaml.cs已经建立了实例化,那么,我想在另外一个类(该类运行在次线程里面)中,访问MainWindow.xaml的UI(比如button/Label等控件)呢?

错误的方式:

为什么会错误呢?

因为原来的MainWindow.xaml.cs类,已经对主窗口进行了实例化。你在这里用错误的方式,进行了二次实例化,就不是原来的MainWindow.xaml.cs了。

因为原来的MainWindow.xaml.cs类,已经对主窗口进行了实例化。你在这里用错误的方式,进行了二次实例化,就不是原来的MainWindow.xaml.cs了。

因为原来的MainWindow.xaml.cs类,已经对主窗口进行了实例化。你在这里用错误的方式,进行了二次实例化,就不是原来的MainWindow.xaml.cs了。

但是,有人问,如果我想用原来的那份(即第一份)MainWindow.xaml.cs类的实例化,怎么办呢?很简单,只要把原来的实例化传到当前的Receive.cs类即可。传递MainWindow的实例化,我目前总结了三种方法。

方法1:默认构造函数中,传输MainWindow类型,然后在MainWindow.xaml.cs类中采用this

Receive.cs类中:

好了,设置好了Receive.cs类,那么我想要用Receive.cs类怎么办,该怎么用呢?简单,在MainWindow.xaml.cs类中,建立一个Receive.cs类的实例化即可:

MainWindow.xaml.cs类中:

这个this就会MainWindow类型传递到Receive.cs里面,你就可以在Receive.cs里面用了。

方法2:在你想要的类中定义属性,然后MainWindow.xaml.cs类中定义方法,方法里面用this,但是必须用static(不建议使用static)

方法3、当然,你可以不用任何属性,直接对Client用静态的方式,然后直接在另外一个类中使用也可以(不建议使用static):

方法4: 采用(MainWindow)Application.Current.MainWindow;可以获取当前应用的主窗口(建议使用这种方式

http://www.cnblogs.com/xiezunxu/articles/8574044.html

三、然后,类似问题,Receive.cs类,如何访问MainWindow.xaml.cs的Socket类的对象Server?(其实这部分你可以跳过,它与之前的第二部分内容类似

        我建立了一个次线程,在次线程上运行receive类的方法receiveFunc。receiveFunc不但访问MainWindow的UI,还要访问MainWindow的对象Server,将Server对象作为一个参数传递过来。该怎么办呢?

解决办法:

四、接着,将讨论线程启动问题

 4.1 、 Socket Server = obj as Socket是什么意思?

            obj as Socket   是将对象 obj 转换为Socket 类型,然后赋值给Server。所以,传递参数的时候,你只需要把obj 传递进来即可。

4.2、我所遇到的线程启动方式:

相关网页

https://www.cnblogs.com/ssjsk/p/8891113.html

https://blog.csdn.net/hyy_sui_yuan/article/details/81263281

方式1(无参数,无参数就是你所调用的方法内,没有参数传递进来,比如我这里的Receive方法。注意啊,第四部分与第二、三部分不是同一个工程,所以第四部的Receive方法,与第二、三部分的Receive.cs类,根本是风牛马不相及)——

这里的Receive,我就是定义为一个方法

这里的Receive,我就是定义为一个方法

这里的Receive,我就是定义为一个方法

方式二(带参数):

4.3、ParameterizedThreadStart又是干嘛的?

--------------------空着先--------------------

--------------------空着先--------------------

--------------------空着先--------------------

4.4、你可能会遇到“无法将方法组转换为threadStart”

解决办法:把string改为object即可

 

五、单实例类+委托,实现两个类之间的相互调用(最好用的方式)

        关于委托,请看我的另一篇https://blog.csdn.net/xpj8888/article/details/89278995

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

我爱AI

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

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

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

打赏作者

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

抵扣说明:

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

余额充值