Почему при Thread.Abort закрывается программа? Как остановить поток? C# [дубликат]

213
14 октября 2018, 07:10

На данный вопрос уже ответили:

  • Остановка работы потока по нажатию кнопки 3 ответа

Есть класс для инвертирования движения мыши. При вызове метода Stop программа продолжает работать. При применении Abort прога закрывается. Как остановить цикл в методе MouseLoop?

 class Inverter
    {
        private Point currentPosition;
        private bool exit;
        public void Start()
        {
            currentPosition = Cursor.Position;
            exit = false;
            (new Thread(new ThreadStart(MouseLoop))).Start();
        }
        public void Stop()
        {exit = true;}
        private void MouseLoop()
        {
            Thread.CurrentThread.IsBackground = true;
            Thread.CurrentThread.Priority = ThreadPriority.Highest;
            while (!exit)
            {
                    Point newPosition = Cursor.Position;
                    int right = currentPosition.X - (newPosition.X - currentPosition.X);
                    int maxWidth = SystemInformation.VirtualScreen.Width;
                    if (right >= maxWidth)
                    {
                        right -= 3;
                    }
                    else if (right <= 0)
                    {
                        right += 1;
                    }
                    int bottom = currentPosition.Y - (newPosition.Y - currentPosition.Y);
                    int maxHeight = SystemInformation.VirtualScreen.Height;
                    if (bottom >= maxHeight)
                    {
                        bottom -= 3;
                    }
                    else if (bottom <= 0)
                    {
                        bottom += 1;
                    }
                    Cursor.Position = new Point(right, bottom);
                    currentPosition = Cursor.Position;
                    Thread.Sleep(1);
                  }}}}
Answer 1

Я думаю, что лучше переписать это так. Не знаю, насколько это верно, но я делал так.

class Inverter
{
    private Point currentPosition;
    private bool exit;
    private Thread MouseLoopThread;
    public void Start()
    {
        currentPosition = Cursor.Position;
        exit = false;
        if (MouseLoopThread == null || MouseLoopThread.ThreadState == ThreadState.Stopped)
        {
            MouseLoopThread = new Thread(new ThreadStart(MouseLoop));
            MouseLoopThread.Priority = ThreadPriority.Highest;
        }
        if (MouseLoopThread.ThreadState == ThreadState.Unstarted)
            MouseLoopThread.Start();
    }
    public void Stop()
    {
        exit = true;
        MouseLoopThread.Join();
    }
    private void MouseLoop()
    {
        while (!exit)
        {
            Point newPosition = Cursor.Position;
            int right = currentPosition.X - (newPosition.X - currentPosition.X);
            int maxWidth = SystemInformation.VirtualScreen.Width;
            if (right >= maxWidth)
            {
                right -= 3;
            }
            else if (right <= 0)
            {
                right += 1;
            }
            int bottom = currentPosition.Y - (newPosition.Y - currentPosition.Y);
            int maxHeight = SystemInformation.VirtualScreen.Height;
            if (bottom >= maxHeight)
            {
                bottom -= 3;
            }
            else if (bottom <= 0)
            {
                bottom += 1;
            }
            Cursor.Position = new Point(right, bottom);
            currentPosition = Cursor.Position;
            Thread.Sleep(1);
        }
    }
}
READ ALSO
Отправка AJAX формы .Net MVC

Отправка AJAX формы .Net MVC

Всем добрый деньПытаюсь отправить AJAX форму на сервер, но метод контроллера, которым должна обрабатываться форма, не вызывается

168
Считывать &ldquo;свайпы&rdquo; пальцем по экрану Unity C#

Считывать “свайпы” пальцем по экрану Unity C#

Мне нужно отслеживать свайп пальцем на "Unity c#"Мне надо чтобы когда игрок делал свайп по экрану, игровая камера двигалась по карте, но не выходила...

147
C# Entity Framework Foreign Key

C# Entity Framework Foreign Key

Существует 3 таблицы :

168