📅  最后修改于: 2023-12-03 15:24:02.948000             🧑  作者: Mango
在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
类,我们可以统一停止所有协程。这些方法都是线程安全的,可以确保正确地停止协程,从而有效地管理内存和资源。