在类之间发送值的正确方法

时间:2012-09-12 12:07:27

标签: c# multithreading variables

之前我问了一个问题,但听起来我没有很好地解释它,所以这里是buggest部分的代码 class packet handler(从数据包接收信息并将它们存储在x,y,并且有struct接受2 ushort ref,所以一旦我定义了一个对象,它就会改变我发送的变量的值)

public class PacketHandler : GUI
    {
        GameUser role;
        public PacketHandler(GameUser who)
        {
            role = who;
        }
        ushort Actualx, Actualy;
        public PacketHandler(ref ushort x ,ref ushort y)
        {
            x = Actualx; y = Actualy;
        }
        public unsafe void HandleServer(byte[] data)
        {
.
.
.
                        case 10010:
                            {
                                if (BitConverter.ToUInt16(data, 8) == 1002)
                                {
                                    Actualx = BitConverter.ToUInt16(data, 24);
                                    Actualy = BitConverter.ToUInt16(data, 26);
                                }
                                break;
                            }

这从数据包中获取值,将它们存储在actualx中,准备将它们提供给定义对象参数的任何ushort引用

这是其他类

public class ClientBase
{
    GameUser role2;
    public ClientBase(GameUser role)
    {
        role2 = role;
        Thread T = new Thread(HuntThread) { Name = "Hunt Thread" };
        T.Start(this);
    }
.
.
.
    public void HuntThread(object Sender)
    {
        ClientBase Client = Sender as ClientBase;
        while (true)
        {
            Monster Target = GetNextkill();
            if (Target != null)
            {
                Thread.Sleep(1000);
                ProxyParadise.Network.Packets.PacketHandler getxandy = new ProxyParadise.Network.Packets.PacketHandler(ref X, ref Y);
                ProxyParadise.Network.Packets.PacketStructure ps = new ProxyParadise.Network.Packets.PacketStructure();
.
.
.

而真正的问题是我在x和y找到零,当我追踪它时我在actualx找到零,但是我确定他们确实得到了一个值,所以我觉得我做的事情很愚蠢

所以总而言之,如果你不能帮我解释这个代码或弄清楚我的意思那么请告诉我一个正确的方法从使用线程获取其他类的值,谢谢大家,请一些mod删除我的旧问题,我现在用更好的方式改写它

1 个答案:

答案 0 :(得分:4)

我们走了:

    ushort Actualx, Actualy;
    public PacketHandler(ref ushort x ,ref ushort y)
    {
        x = Actualx; y = Actualy;
    }

您要将字段中的值(最初为零)分配给参数,而不是将参数中的值分配给字段:

    ushort Actualx, Actualy;
    public PacketHandler(ushort x , ushort y)
    {
        Actualx = x;
        Actualy = y
    }

注意我也删除了ref;这会产生令人讨厌的副作用(在原始代码中)擦除你传入的by-ref变量,因为这些字段最初为零。

但是,无法做的是存储“对ushort”的引用作为字段。如果需要,最好的办法是将值放到类上,然后引用对象:

class Foo {
    public ushort Value {get;set;}
}

然后任意数量的调用者都可以引用同一个Foo对象,因此更新一个是全部更新。坦率地说,您的PacketHandler已经取代Foo;诀窍是让多段代码引用处理程序,并从对象中获取.ActualX / .ActualY