Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 传输值会在线程c上抛出类_C#_Multithreading_Class_Object_Instance - Fatal编程技术网

C# 传输值会在线程c上抛出类

C# 传输值会在线程c上抛出类,c#,multithreading,class,object,instance,C#,Multithreading,Class,Object,Instance,不幸的是,我第三次问这个问题,我认为每次我问这个问题都没有意义,但是让我们用更多的单词/代码、照片和简单的测试再试一次 我有两个类,一个接收数据包并从中获取值,另一个应该使用这些值,但我无法从这个类中获取它们 注意:此值可由新线程使用 让我们来看看代码 namespace ProxyParadise.Network.Packets { public class PacketHandler { public PacketHandler() // takes no

不幸的是,我第三次问这个问题,我认为每次我问这个问题都没有意义,但是让我们用更多的单词/代码、照片和简单的测试再试一次 我有两个类,一个接收数据包并从中获取值,另一个应该使用这些值,但我无法从这个类中获取它们 注意:此值可由新线程使用 让我们来看看代码

namespace ProxyParadise.Network.Packets
{

    public class PacketHandler
    {
        public PacketHandler() // takes no parameters using get/set , failed take 1
        {
            Console.WriteLine("defining an object to get x,y take 1, value now is (" + actualX + "," + actualY + ")");
        }
        public void getxy(ushort Actualx, ushort Actualy) //using get and set with parameters failed take 2
        {
            Console.WriteLine("defining an object to get x,y take 2, value now is (" + actualX + "," + actualY + ")");
            actualX = actualX; Actualy = actualY;
        }
        public ushort actualX { get; set; }
        public ushort actualY { get; set; }
public unsafe void HandleServer(byte[] data)
        {
            try
            {
                    var type = *((ushort*)(ptr + 2));
                    switch (type)
                    {
                        case 10010:
                            {
                                if (BitConverter.ToUInt16(data, 24) != 0)
                                {
                                    actualX = BitConverter.ToUInt16(data, 24);
                                    actualY = BitConverter.ToUInt16(data, 26);
                                    Console.WriteLine("account coords updated to (" + actualX + "," + actualY + ")");
                                }
                                break;
                            }
                    }
这是一张测试这个的图片,每当我收到这个数据包时,它就会在控制台上写下 现在,我试图在另一个类上获取这些值,所以我对它们做了一些处理,并将数据包发送到服务器,所以这里是另一个类,整个类,所以对于那些说我不应该发布重要部分的人来说是有意义的

public class ClientBase
{
    GameUser role2;
    PacketHandler ph = new PacketHandler();
        public ushort X, Y;
        PacketHandler ph2 = new PacketHandler();

    public ClientBase(GameUser role)
    {
        role2 = role;
        Thread T = new Thread(HuntThread) { Name = "Hunt Thread" };
        T.Start(this);
        Console.WriteLine("with name : " +T.Name +  " with execution context : "+T.ExecutionContext +" with state : "+ T.IsAlive + " with id : " + T.ManagedThreadId);
       T.Join();
    }
    Monster GetNextkill()
    {
       // byte Range = 18;
        Monster CurrentTarget = null;
        foreach (KeyValuePair<uint, Monster> Pair in Dictionary.Clone(Dictionary.Monsters))
        {
          //  if (Math.Max(Math.Abs( - Pair.Value.X), Math.Abs(pp.Y - Pair.Value.Y)) > 18)
          //  {
          //      Dictionary.Monsters.Remove(Pair.Key);
          //  }
           // else if (Math.Max(Math.Abs( - Pair.Value.X), Math.Abs(pp.Y - Pair.Value.Y)) <= Range)
           // {
           //     Range = (byte)Math.Max(Math.Abs(this.X - Pair.Value.X), Math.Abs(this.Y - Pair.Value.Y));
                CurrentTarget = Pair.Value;
             //   Console.WriteLine("there is " + Dictionary.Monsters.Count + " monster around you");
          //  }
        }
        return CurrentTarget;
    }
    public void HuntThread(object Sender)
    {
        try
        {
            ClientBase Client = Sender as ClientBase;
            while (true)
            {
                Monster Target = GetNextkill();
                if (Target != null)
                {
                    Thread.Sleep(1000);
                    ProxyParadise.Network.Packets.PacketStructure ps = new ProxyParadise.Network.Packets.PacketStructure();
                    //       ps.__Packet1022XP(Target.UID, Target.X, Target.Y); 
                    int xxx = Target.X - 1;
                    int yyy = Target.Y - 1;
                    ph2.getxy(X, Y);
                    Console.WriteLine("x and y in the thread is " + X + Y);
                    ps.__Packet10010(Target.X, Target.Y, role2, "normal", "server", ph.actualX, ph.actualY);
                    Thread.Sleep(1000);
                    ps.__Packet10010(Target.X, Target.Y, role2, "sdasdsa", "client", role2.X, role2.Y);
                    Thread.Sleep(1000);
                    ps.__Packet1022NONEXP(Target.UID, Target.X , Target.Y, role2);
                    //if fatal strike is on attack the monster 
                    //else
                    //jump next to the target and attack
                    Dictionary.Monsters.SafeRemove(Target.UID);

                }
                return;
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine("expection error : " + ex);
        }
    }
    public uint UID;

}
所以现在的问题是,set/get和定义一个对象来获取值的两种方法我都做了两次,试图从一个结构的方法中获取它们,但都失败了

现在,这里是测试图像

我怀疑为什么它是零,我有时认为这是因为新对象,有时我认为这是因为线程

这一次我真的很想得到帮助,因为我已经花了4天的时间在做同样的事情,做了很多我听说过的方法,但没有锁 我真的非常感谢您阅读本文,并在时间和信息方面帮助我,我对此表示感谢:
还感谢修改了我的拼写和语法

这里显示的名称、参数和属性中的大小写字母是否与正在运行的代码中的完全相同

public void getxy(ushort Actualx, ushort Actualy) //using get and set with parameters failed take 2
{
    Console.WriteLine("defining an object to get x,y take 2, value now is (" + actualX + "," + actualY + ")");
    actualX = actualX; Actualy = actualY;
}
因为如果我改变了参数的名称,你就会明白为什么这看起来是错误的

public void getxy(ushort inputx, ushort inputy) //using get and set with parameters failed take 2
{
    Console.WriteLine("defining an object to get x,y take 2, value now is (" + actualX + "," + actualY + ")");
    actualX = actualX; inputy = actualY;
}
这当然可以解释为什么它们总是零,它们永远不会改变


您是否尝试过在代码中输入断点,并在调试中单步执行代码,特别是getxy方法,以准确查看每次的输入和输出值?

首先感谢您的回复,这是一个输入错误,但它只会影响actualx not Actual或您的文字actualx not inputy,但两者都是零,所以是的,在解决了这个问题之后,问题仍然存在,是的,我确实尝试过跟踪它,但仍然不知道,因为我得到了很多线程,它继续在20个线程上进行一步,然后在主程序上进行一步,但即使我通过跟踪某个线程找到了零,但通过跟踪普通代码,我找到了正确的值,我又一次这样做了,如果我不使用thread中的对象调用方法/结构,它将给出正确的值,但当我从thread中调用它时,它将给出零:O cluelessI建议您先阅读以下内容,以帮助您处理线程:。但是我认为我在代码中看到了另一个问题,在HuntThread中,您调用ph2.getxyX,Y,但是我没有看到在代码中任何地方设置了X和Y。不要使用trace,实际上在那一行上放一个断点,在调试模式下运行这个东西,然后逐步遍历代码,并在每次被命中时检查X和Y的值。此外,您似乎从未在ph2.getxy行中使用过xxx和yyy