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