📜  如何停止协程统一 c# (1)

📅  最后修改于: 2023-12-03 15:24:02.948000             🧑  作者: Mango

如何停止协程统一 c#

在c#中使用协程时,编写一个完整的协程,包含启动、执行以及停止三个阶段。停止协程是一个重要的问题,它可能用于处理用户操作或系统停机等不需要协程的情况。

停止协程的方法

停止协程的方法有多种,但在c#中,我们通常使用协程的取消令牌。 拥有取消令牌的协程可以通过调用Token.IsCancellationRequested来停止。 下面是一个简单的例子:

public async Task DoSomeWork(CancellationToken cancellationToken)
{
    while (true)
    {
        if (cancellationToken.IsCancellationRequested)
        {
            cancellationToken.ThrowIfCancellationRequested();
        }

        // Do some work
    }
}

在这个例子中,我们循环执行协程,每次检查取消令牌是否已经发出。 如果是,则抛出OperationCanceledException异常。由于这是一个异步协程,我们需要将其转换为Task类型来让它可以通过异步等待来停止。

统一停止协程

使用协程取消令牌是一个有效的方式来停止单个协程。但如果我们有多个协程在运行,如何停止它们?我们可以通过创建一个事件来实现统一的协程停止,如下所示:

public class CoroutineStopper
{
    private readonly object m_lock = new object();
    private readonly List<CancellationTokenSource> m_cancellationTokens = new List<CancellationTokenSource>();

    public CancellationToken Create()
    {
        lock (m_lock)
        {
            var cancellationToken = new CancellationTokenSource();
            m_cancellationTokens.Add(cancellationToken);
            return cancellationToken.Token;
        }
    }

    public void StopAll()
    {
        lock (m_lock)
        {
            foreach (var cancellationToken in m_cancellationTokens)
            {
                cancellationToken.Cancel();
            }

            m_cancellationTokens.Clear();
        }
    }
}

在这个示例中,我们创建了一个CoroutineStopper类,该类包含创建并存储取消令牌的方法。在创建新协程时,我们返回该协程的取消令牌。

当我们需要停止所有协程时,我们可以直接调用StopAll方法。这将取消所有已经创建的协程。同时,CoroutineStopper类还在线程安全的方式下存储这些取消令牌。

总结

通过使用协程的取消令牌,我们可以停止单个协程。通过创建一个CoroutineStopper类,我们可以统一停止所有协程。这些方法都是线程安全的,可以确保正确地停止协程,从而有效地管理内存和资源。