c# - 如何取消任务类型集合中的特定任务
问题描述
所以我试图找出一种取消特定任务的方法。在示例中,我想取消它产生的 3 个任务中的 2 个
static async Task Main(string[] args)
{
var tasks = Enumerable.Range(0, 3).Select(x => Task.Run(() =>
{
Counter();
}));
await Task.WhenAll(tasks);
Console.ReadLine();
}
public static void Counter()
{
while (true)
{
for (int i = 0; i < 1000; i++)
{
Console.WriteLine(i);
}
}
}
如果我要这样做while (someProperty)
并更改someProperty
为,false
那么所有线程都会停止。我想停止 2/3,我该怎么做?
解决方案
CancellationToken
如果你想单独取消它们,你需要为你开始的每个任务传递一个:
static async Task Main(string[] args)
{
var cancellationSources = Enumerable.Range(0, 3)
.Select(_ => new CancellationTokenSource())
.ToList();
var tasks = Enumerable.Range(0, 3).Select(x => Task.Run(
() => Counter(cancellationSources[x].Token),
cancellationSources[x].Token
));
cancellationSources[1].Cancel();
await Task.WhenAll(tasks);
Console.ReadLine();
}
public static void Counter(CancellationToken cancellationToken)
{
while (!cancellationToken.IsCancellationRequested)
{
// or while(true) and token.ThrowIfCancellationRequested(); to throw instead
for (int i = 0; i < 1000; i++)
{
Console.WriteLine(i);
}
}
}
推荐阅读
- c - 打印引号内的内容的 C 程序。”。在文本文件中
- raspberry-pi - 使用 VPN 在网络命名空间中运行传输守护进程
- c++ - C++ 如果我 Endl,它会在文件末尾捕获字符“\n”,如果我不写 endl,它会捕获最后一个字符两次
- r - 重命名数据框中的多列向量而不键入所有名称
- python - Apache Beam 会话窗口不返回任何内容
- pip - Bazel Python 依赖错误 - 在获取存储库 python_external_deps 期间发生错误
- tensorflow - 如何使用专门用于 GCP 的 TFX SDK 实现 Kubeflow“运行参数”?
- python - 在有向加权图中找到从起点到所有目的地的最短路径的最快方法
- python - 为什么 Keras.preprocessing.sequence pad_sequences 处理字符而不是单词?
- c - 学习多线程,不明白为什么示例只带来很小(10%)的性能提升