c#线程,总是得到错误

本文关键字:错误 线程 | 更新日期: 2023-09-27 17:51:15

请帮我弄清楚这段代码:

using System.Windows.Forms;
using AionInterface;
using System.Threading;
    namespace mover
    {
        public class MoveToCoord : IAionInterface
        {
            Thread tr;
            Thread repeater;
            public MoveToCoord()
            {
                tr = new Thread(LetsWork);
                repeater = new Thread(Repeater);
            }
            public void Sleep(int ms)
            {
                Thread.Sleep(ms);
            }
            public void SetPosition(float x, float y, float z)
            {
                Game.Player.SetPosition(x, y, z);
            }
            public void OnClose()
            {
                return;
            }
            public void OnLoad()
            {
                //Game.Register("FindTarget", "f", KeysModifier.Control);
            }
            public void OnRun()
            {
                repeater.Start();
            }
            public void Repeater()
            {
                for (int i = 1; i < 5; i++)
                {
                    tr.Start();
                    Thread.Sleep(6000);
                }
            }
            public void LetsWork()
            {
                Thread.Sleep(1000);
                SetPosition(1926, 1771, 163);
                Thread.Sleep(1400);
                SetPosition(1930, 1774, 163);
                Thread.Sleep(1400);
            }
            public void CancelScript()
            {
                Game.Close();
            }
        }
    }

我需要执行方法LetsWork 5次延迟6秒,不幸的是我不知道任何编程语言,仍然很难理解我线程是如何工作的。

c#线程,总是得到错误

如果你的目标是运行LetsWork 5次,延迟6秒,你不需要线程。如果你的目标是运行LetsWork 5次,5次同时6秒延迟,然后使用线程。

线程的基本前提是同时执行代码。

您只需要GUI线程和一个工作线程来避免冻结。根据你的代码,你可以做同样的事情,但简化为只使用1个工作线程。作为一方不是你真的需要张贴你的错误,因为我不可能执行你的代码,我不知道如果下面的代码将修复错误是或否。它只是解决了一个设计问题。

using System.Windows.Forms;
using AionInterface;
using System.Threading;
    namespace mover
    {
        public class MoveToCoord : IAionInterface
        {
            Thread tr;
            public MoveToCoord()
            {
                tr = new Thread(LetsWork);
            }
            public void Sleep(int ms)
            {
                Thread.Sleep(ms);
            }
            public void SetPosition(float x, float y, float z)
            {
                Game.Player.SetPosition(x, y, z);
            }
            public void OnClose()
            {
                return;
            }
            public void OnLoad()
            {
                //Game.Register("FindTarget", "f", KeysModifier.Control);
            }
            public void OnRun()
            {
                tr.Start();
            }
            public void LetsWork()
            {
                for (int i=0;i<6;++i){
                    Thread.Sleep(1000);
                    SetPosition(1926, 1771, 163);
                    Thread.Sleep(1400);
                    SetPosition(1930, 1774, 163);
                    Thread.Sleep(1400);
                    Thread.Sleep(6000);
                } 
            }
            public void CancelScript()
            {
                Game.Close();
            }
        }
    }