当前位置:编程学习 > C#/ASP.NET >>

C#多线程通信以及类之间相互调用问题

UI作为主线程,socket为一个子线程,现在希望将子线程得到的数据反映到UI上;

由于控件是不能跨线程的,所以使用了invoke;
如果UI和socket是在一个类class UI()里那就没问题了,只需要对UI上的该控件invoke一下,
为了清晰,我把socket放在了一个新的class Socket()内,这样在class Socket()内我无法访问到UI的控件了(private的),
所以我就在class UI()里面public了一个函数从而在class Socket()中得到访问该控件,

可是这样就又涉及到了一个类之间相互调用的问题,
因为在class UI()里面为了进入socket是已经开辟了一个class Socket()的对象了,
所以现在如果在class Socket()类里面invoke该控件的话该怎么操作?

不知道思路对不对。 --------------------编程问答-------------------- class socket中定义得到数据事件
class ui订阅事件,然后invoke --------------------编程问答-------------------- socket子线程里面定义委托,当有数据时直接调用委托。
UI主线程实现子线程的委托就可以了。

--------------------编程问答-------------------- 用委托吧,socket类中尽量不要使用ui类 --------------------编程问答-------------------- 我现在困惑的是invoke的问题,
我是这么做的,因为invoke是出现在执行更新UI显示这个操作的函数里,可是这个函数位于socket这个线程中(同时物理位置是在class Socket()这个类中),那么我在这个函数里无法调用到UI控件啊,这样怎么对这个控件invoke?
引用 1 楼  的回复:
class socket中定义得到数据事件
class ui订阅事件,然后invoke
--------------------编程问答-------------------- 在socket类中不使用UI类的话,
你的意思是不是把更新UI界面的函数(invoke在该函数内部)放在UI类中,然后通过事件注册这个函数,
再在socket类里调用注册对象的方法,从而实现在socket类中不出现UI类

我刚这样做,是可行的,但是不知道你是不是这个意思
引用 3 楼  的回复:
用委托吧,socket类中尽量不要使用ui类
--------------------编程问答--------------------
引用 4 楼  的回复:
我现在困惑的是invoke的问题,
我是这么做的,因为invoke是出现在执行更新UI显示这个操作的函数里,可是这个函数位于socket这个线程中(同时物理位置是在class Socket()这个类中),那么我在这个函数里无法调用到UI控件啊,这样怎么对这个控件invoke?

引用 1 楼 的回复:

class socket中定义得到数据事件
class ui订阅事件,然后invo……


跟invoke一点关系都没有。你自己写的所谓class Socket类中代码,别管它是不是在子线程被执行的(假设它就是在窗口线程被调用的),你想明白了如何访问控件了吗?

没有能够写出访问控件的代码,就不要纠缠什么子线程问题。你可以删除有关线程的所有代码,先写出class Socket类中的代码如何访问class UI类中的控件的代码来。 --------------------编程问答--------------------
引用 5 楼  的回复:
在socket类中不使用UI类的话,
你的意思是不是把更新UI界面的函数(invoke在该函数内部)放在UI类中,然后通过事件注册这个函数,
再在socket类里调用注册对象的方法,从而实现在socket类中不出现UI类

我刚这样做,是可行的,但是不知道你是不是这个意思


我不知道你说的“是可行的”具体是什么意思。如果你的class Socket中的代码触发事件,那么你的class UI重的事件处理代码也就工作在子线程中。

另外,这就意味着“class Socket”没有职责去处理数据显示,也就是说出事设计原则需要根本性的修改。你是否站在这个高度去进行设计呢?如果你只是为了图省事、写代码方便,而不是修改自己的根本的设计,那么应该保持你之前的设计,让class Socket中的代码去访问界面控件,而不是随便修改基本的设计。如果你决定修改设计,那么要想好了再坚决去修改,不要仅仅站在很低级的“为了写这几行时代码图省事”的角度上。 --------------------编程问答-------------------- socket类访问UI类控件的话,我能想到的几个方法是:
1,设置控件为static
2,从UI类传递this指针过去
3,使用delegate
对于1的话肯定是能实现的,不过肯定不会这么做么;
对于2的话也是可以的,但是在我现在的程序里有个问题就是,我在socket类中使用了异步AsyncCallback方法,没办法传递obj这个参数进去了;
3的话,我上午试了一下,也是能实现的,也就是我在5楼所说的“是可行的”;

不知道还有什么方法能实现两个类互相调用变量不?
引用 6 楼  的回复:
引用 4 楼  的回复:
我现在困惑的是invoke的问题,
我是这么做的,因为invoke是出现在执行更新UI显示这个操作的函数里,可是这个函数位于socket这个线程中(同时物理位置是在class Socket()这个类中),那么我在这个函数里无法调用到UI控件啊,这样怎么对这个控件invoke?

引用 1 楼 的回复:

class socket中定义得到数据事件
clas……
--------------------编程问答-------------------- 我是在socket类中实现触发事件的,然后我的事件处理代码是写在UI类里面;
因为invoke我是前天接触的,我既然需要对一个控件invoke,就必须要能调用到吧
所以我有两种做法:
1,在socket类中invoke,这就涉及到了两个类相互调用控件的问题,怎么实现的话我知道的是之前说的三种;
2,在UI类中invoke,这样避免了在socket类中invoke,然后通过在socket声明事件,在UI类注册事件方法,再在socket类中调用所注册的方法,从而实现结果,这是我在之前说的“是可行的”的意思。

至于我到底是哪种设计原则,我就是想在这个反复修改的过程中获得理想的设计原则啊
引用 7 楼  的回复:
引用 5 楼  的回复:
在socket类中不使用UI类的话,
你的意思是不是把更新UI界面的函数(invoke在该函数内部)放在UI类中,然后通过事件注册这个函数,
再在socket类里调用注册对象的方法,从而实现在socket类中不出现UI类

我刚这样做,是可行的,但是不知道你是不是这个意思


我不知道你说的“是可行的”具体是什么意思。如果你的class Socket中的……
--------------------编程问答-------------------- 第二种做法更合理。
从逻辑上说,Socket类应该只负责数据的收发,而数据在界面的显示应该是UI负责的事。因此,Socket在收到数据后以事件发布的形式(即委托)通知UI,而UI通过订阅该事件而自动获得通知。
至于Invoke,那是控件的方法之一,自然应该放在UI中。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,