终止worker执行的方法

2025-11-17 01:06:45

1、该示例创建一个名为 Worker 的类,该类包含辅助线程将执行的方法 DoWork。这实际上是辅助线程的 Main 函数。辅助线程将通过调用此方法来开始执行,并在此方法返回时自动终止。

public void DoWork()

{

    while (!_shouldStop)

    {

        Console.WriteLine("worker thread: working...");

    }

    Console.WriteLine("worker thread: terminating gracefully.");

}

2、Worker 类包含另一个方法,该方法用于通知 DoWork 它应当返回。此方法名为 RequestStop,如下所示:

public void RequestStop()

{

    _shouldStop = true;

}

3、RequestStop 方法只是将 true 赋给 _shouldStop 数据成员。由于此数据成员由 DoWork 方法来检查,因此这会间接导致 DoWork 返回,从而终止辅助线程。但是,您应当注意:DoWork 和 RequestStop 将由不同线程执行。DoWork 由辅助线程执行,而 RequestStop 由主线程执行,因此 _shouldStop 数据成员声明为 volatile,如下所示:

private volatile bool _shouldStop;

4、此时,只有执行 Main 的主线程还存在。它会显示一条最终消息,然后返回,从而使主线程也终止。

下面是完整的示例。

using System;

using System.Threading;

public class Worker

{

    // This method will be called when the thread is started.

    public void DoWork()

    {

        while (!_shouldStop)

        {

            Console.WriteLine("worker thread: working...");

        }

        Console.WriteLine("worker thread: terminating gracefully.");

    }

    public void RequestStop()

    {

        _shouldStop = true;

    }

    // Volatile is used as hint to the compiler that this data

    // member will be accessed by multiple threads.

    private volatile bool _shouldStop;

}

public class WorkerThreadExample

{

    static void Main()

    {

        // Create the thread object. This does not start the thread.

        Worker workerObject = new Worker();

        Thread workerThread = new Thread(workerObject.DoWork);

        // Start the worker thread.

        workerThread.Start();

        Console.WriteLine("main thread: Starting worker thread...");

        // Loop until worker thread activates.

        while (!workerThread.IsAlive);

        // Put the main thread to sleep for 1 millisecond to

        // allow the worker thread to do some work:

        Thread.Sleep(1);

        // Request that the worker thread stop itself:

        workerObject.RequestStop();

        // Use the Join method to block the current thread 

        // until the object's thread terminates.

        workerThread.Join();

        Console.WriteLine("main thread: Worker thread has terminated.");

    }

}

5、输出如下:

main thread: starting worker thread...

worker thread: working...

worker thread: working...

worker thread: working...

worker thread: working...

worker thread: working...

worker thread: working...

worker thread: working...

worker thread: working...

worker thread: working...

worker thread: working...

worker thread: working...

worker thread: terminating gracefully...

main thread: worker thread has terminated

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢