Ilyas Zahir Ответов: 2

Старт стоп возобновить поток с#


Эй, я работаю над примером того, как заставить поток запускаться, останавливаться и продолжать работу после остановки
я написал код для запуска, но не знал, как остановить тот же поток

private void startBtn_Click(object sender, EventArgs e)
        {
            //START BG WORKER
            backgroundWorker1.RunWorkerAsync();
            Thread thr = new Thread(Start);
            thr.SetApartmentState(ApartmentState.STA);
            thr.Start();
        }
        static void Start()
        {
            var dr = new ChromeDriver();
            dr.Navigate().GoToUrl("http://www.google.com");
            dr.Navigate().GoToUrl("http://www.facebook.com");
        }
        private void cancelBtn_Click(object sender, EventArgs e)
        {
        }
        private void contiBtn_Click(object sender, EventArgs e)
        {
        }


Что я уже пробовал:

как запустить,остановить, возобновить поток в c#

George Swan

Я не думаю, что разумно останавливать и перезапускать потоки. Такие действия блокируют потоки и приводят к неэффективному использованию пула потоков. Моя рекомендация, как бы то ни было, состояла бы в том, чтобы отказаться от использования BackgroundWorker и принять современные асинхронные методы, предоставляемые async await asynchronous framework на основе задач. Эти методы дают достаточную абстракцию, чтобы вам не приходилось напрямую маршалировать потоки.

2 Ответов

Рейтинг:
2

OriginalGriff

В принципе, это не рекомендуется: в классе Thread есть методы для этого - Suspend и Resume - но они обесцениваются и по уважительным причинам! Это небезопасно: это может привести к тупикам и подобным проблемам, поскольку "приостановленный" поток не имеет реального представления о том, что делал "приостановленный" поток, когда он был остановлен. Это нехорошо, совсем нехорошо.

Видеть здесь: Приостановка и возобновление потоков[^]
Лучшая идея использовать синхронизацию потоков - см. здесь: Обзор примитивов синхронизации[^]


Рейтинг:
1

F-ES Sitecore

Читая людям строки, Я думаю, что вам нужно просто встроить дополнительную логику в свой код, чтобы он знал, когда остановиться и когда продолжить, а не останавливать и возобновлять поток.

public class Navigator
{
    private bool isRunning;
    private Thread thread;
    private ManualResetEvent resetEvent = new ManualResetEvent(true);

    public List<string> Urls { get; set; }

    public Navigator()
    {
        this.isRunning = false;
        this.Urls = new List<string>();
    }

    public void Start()
    {
        if (this.isRunning)
        {
            return;
        }

        this.isRunning = true;

        thread = new Thread(Process);
        thread.Start();
    }

    private void Process()
    {
        foreach (string url in this.Urls)
        {
            // if the isRunning flag is cleared then drop out of the loop
            if (!this.isRunning)
            {
                return;
            }

            Debug.WriteLine(string.Format("Processing {0}", url));
            Thread.Sleep(3000); // simulates doing work

            // if "unset" the thread will wait here otherwise it will continue
            resetEvent.WaitOne();
        }
    }

    public void Pause()
    {
        // unset the reset event which will cause the loop to pause
        this.resetEvent.Reset();
        Debug.WriteLine("Paused");
    }

    public void Resume()
    {
        // set the reset event which will cause the loop to continue
        this.resetEvent.Set();
        Debug.WriteLine("Resumed");
    }

    public void Stop()
    {
        Debug.WriteLine("Stopping...");

        // set a flag that will abort the loop
        this.isRunning = false;

        // set the event incase we are currently paused
        this.resetEvent.Set();

        // wait for the thread to finish
        this.thread.Join();

        Debug.WriteLine("Stopped");
    }
}


private Navigator nav;

public Form1()
{
    InitializeComponent();
}

private void startBtn_Click(object sender, EventArgs e)
{
    this.nav = new Navigator();

    nav.Urls.Add("http://www.url1.com");
    nav.Urls.Add("http://www.url2.com");
    nav.Urls.Add("http://www.url3.com");
    nav.Urls.Add("http://www.url4.com");
    nav.Urls.Add("http://www.url5.com");
    nav.Urls.Add("http://www.url6.com");
    nav.Urls.Add("http://www.url7.com");
    nav.Urls.Add("http://www.url8.com");
    nav.Urls.Add("http://www.url9.com");
    nav.Urls.Add("http://www.url10.com");

    nav.Start();
}

private void pauseBtn_Click(object sender, EventArgs e)
{
    if (this.nav == null)
    {
        return;
    }

    nav.Pause();
}

private void resumeBtn_Click(object sender, EventArgs e)
{
    if (this.nav == null)
    {
        return;
    }

    nav.Resume();
}

private void stopBtn_Click(object sender, EventArgs e)
{
    StopProcess();
}

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    StopProcess();
}

private void StopProcess()
{
    if (this.nav == null)
    {
        return;
    }

    nav.Stop();
}


Ilyas Zahir

Эй пожалуйста я не понял первый код если у вас есть какой либо учебник чтобы понять его пожалуйста поделитесь им со мной или если вы могли бы сделать то же самое с моим кодом пожалуйста