"while(true)"循环确实可以永久工作

Shynex

成员
已加入
2020年1月28日
留言内容
11
编程经验
Beginner
因此,目前我正在使用Visual Studio附加硒来编写c#Steam Bot。
到目前为止,它运行良好,但是"while (true)"循环会在一段时间后停止。
有时它运行600次,但也有一些运行只有100次迭代。
我非常感谢每个可以解决我的问题的想法。:)

基本上就是代码:

C#:
而(真)
{
    //Click some Buttons
    //Save some Numbers

    if (I like the Item)
    {
        //buyItem();
    }

    Reload_the_Numbers()
    reloadButton.Click();
    wait(5);
}
 
由主持人最后编辑:

羊皮

知名会员
已加入
2018年9月5日
留言内容
1,982
编程经验
10+
With Selenium, are you calling wait.until .ExecuteScript("return document.readyState").Equals("Complete") before executing more actions in your above steps?

如果是这样,则可以避免第19条后的某些问题。
 

Shynex

成员
已加入
2020年1月28日
留言内容
11
编程经验
Beginner
不,我不那样做。你能解释一下它的作用吗?
(我会尽力"open"while(true)循环的新线程)
 
Last edited:

Shynex

成员
已加入
2020年1月28日
留言内容
11
编程经验
Beginner
好吧,我只是想弄清楚 :)。我是否为while(true)循环创建了一个独立线程?
 
Last edited:

羊皮

知名会员
已加入
2018年9月5日
留言内容
1,982
编程经验
10+
不,我不那样做。你能解释一下它的作用吗?
这就解释了为什么您的循环很可能不会连续运行。搜索我编写的代码,您应该找到许多等待页面就绪状态真正完成加载的变体。如何单击页面中尚未完全加载的元素?

为什么不使用Steam API而不是Selenium?

您可能节省了无数的工作时间。
 

羊皮

知名会员
已加入
2018年9月5日
留言内容
1,982
编程经验
10+
我知道这是该主题的较晚答复,但我原本打算在几天前提交此帖子,而现在才可以解决。但是鉴于已经发现您的代码为何停止的原因是您的行为 估计 当页面准备就绪时,可能会导致代码锁定,并使此回复与原始问题有点无关,但是,这与应该如何实现代码无关,这里就是。
What @Sheepings 试图说的是,这是"the bad way"停止该无限循环:
C#:
void BadRunInfinite()
{
    while (true)
    {
        Console.WriteLine($"{DateTime.Now}");
        Thread.Sleep(1000);
    }
}

void BadWayToStop()
{
    var thread = new Thread(BadRunInfinite);
    thread.Start();

    // Let BadRunInfinite() run for about 5 seconds
    Thread.Sleep(5000);

    // Kill the thread
    thread.Abort();
}

这是告诉循环中断的方法:
C#:
ManualResetEvent _stop;

void GoodRunInfinite()
{
    while (true)
    {
        Console.WriteLine($"{DateTime.Now}");

        if (_stop.WaitOne(1000))
            break;
    }
    Console.WriteLine("Done.");
}

void GoodWayToStop()
{
    _stop = new ManualResetEvent(false);
    var thread = new Thread(GoodRunInfinite);
    thread.Start();

    // Let GoodRunInfinite() run for about 5 seconds
    Thread.Sleep(5000);

    // Tell the thread to stop
    _stop.Set();

    // Wait for the thread to exit
    thread.Join();
}
在遍历主题的过程中,我一直想用一些代码来回答,但我发现了一个模糊而简单的示例,说明如何管理线程集合以及如何与线程集合进行交互。尽管您的主题最初是由我自己引导的,尽管该主题与停止执行代码没有直接关系。我认为值得与您和未来的用户分享这一点,同时它将帮助您了解如何在C#中传递对象。例如您的线程集合,以及如何与线程进行通信等。无论如何,这里是:
C#:
using System;
using System.Collections.Generic;
using System.Threading;

namespace TestConsoleApp
{
    internal static class Program
    {
        private static void Main(string[] args)
        {
            Thread longRunningThread = new Thread(() => Exec_WhileLoop());
            longRunningThread.Name = "LongRunning";
            longRunningThread.Start();
            var ThreadCollection = new List<Thread>();
            ThreadCollection.Add(longRunningThread); /* Using the Thread Collection you can refer some aspects of running threads */
            ThreadCollection = Threads.Thread_Info(ThreadCollection);
        }
        private static void Exec_WhileLoop()
        {
            var i = 1;
            do
            {
                /* Do your work here */
                Console.WriteLine($"Executed {i++} times and continues to run");
                Thread.Sleep(10000);
            }
            while (true);
        }
        public static class Threads
        {
            public static List<Thread> Thread_Info(List<Thread> l_Threads)
            {
                var threads_toRemove = new List<Thread>();
                foreach (Thread current_Thread in l_Threads)
                {
                    if (current_Thread.Name == "LongRunning" && current_Thread.IsAlive)
                    {
                        Console.WriteLine($"Do something with the {current_Thread.Name} thread.");
                        /* This is where you implement your thread stopping as outlined in above post
                         * After you stop the thread, (should you want to) you should remove the thread from your thread collection */
                        threads_toRemove.Add(current_Thread);
                    }
                }
                foreach (Thread toRemove in threads_toRemove)
                {
                    /* Check that your thread is stopped and then remove it from your thread collection. */
                    l_Threads.RemoveAll(r => r.Name == "LongRunning");
                }
                return l_Threads;
            }
        }
    }
}
通过以上操作,您仅需要实现ManualResetEvent,然后执行检查以取消线程。上面是执行此操作的模糊模板。您或以后的读者都可能会有所帮助。唯一需要添加到第39行的内容已由演示 @跳伞 这里 : "while(true)"循环确实可以永久工作 -我之所以这样发表是因为,最好是您学会在新线程/后台线程中执行长时间运行的方法,并学习如何通过保留在此类线程上的集合与这些线程进行对话。
 
最佳 底部