【问题标题】:Stop Tasks with token used in an array of tasks使用在任务数组中使用的令牌停止任务
【发布时间】:2018-07-25 22:49:04
【问题描述】:

我有这个例子:

var asyncTasks = new Task[list.Length];
for (int i = 0; i< list.Length; i++)
{
    asyncTasks[i] = tf(cts.Token, list[i]);                
}
await Task.WhenAll(asyncTasks);
//do other stuffs when all tasks completed

当然我有我的async 函数,称为tf

private async Task tf(CancellationToken token , string list)
{
        try
        {
            await Task.Run(() =>
            {
                if (token.IsCancellationRequested)
                {
                    MessageBox.Show("Stopped", "Operation Aborted");
                    token.ThrowIfCancellationRequested();
                    cts = new CancellationTokenSource();
                } 
                // do something
            }, token);
       }catch{}
       cts = new CancellationTokenSource();
}

编辑:在我的取消按钮中我声明:cts.Cancel();

此方法对我来说很有效,因为它同时执行一系列任务,但我认为我无法发送取消请求的令牌,因为所有已分配的 cts.Token 都是有效的,所以如果在另一个按钮我尝试cts.Cancel() 这不起作用。我该如何做同样的事情但使取消令牌请求有效?

【问题讨论】:

  • 为什么不起作用?您已经准确地概述了 CancellationTokens 应该如何工作:您从源传递令牌并调用 cts.Cancel()。请edit您的问题提供更多详细信息。
  • 修改了更多细节,但对我不起作用
  • 是我,还是你在一个任务中冗余运行一个任务?
  • 那么你想做什么,开始一堆任务,然后用取消令牌同时取消它们?
  • 没错,该方法适用于我正在尝试做的事情,但取消令牌是唯一约束

标签: c# multithreading task token


【解决方案1】:

问题是我在任务函数结束时使用cts = new CancellationTokenSource(); 重置了每次调用的令牌

功能固定:

private async Task tf(CancellationToken token , string list)
{
        try
        {
            await Task.Run(() =>
            {
                if (token.IsCancellationRequested)
                {
                    MessageBox.Show("Stopped", "Operation Aborted");
                    token.ThrowIfCancellationRequested();
                    cts = new CancellationTokenSource();
                } 
                // do something
            }, token);
       }catch{}
}

【讨论】:

    猜你喜欢
    • 2019-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-12
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多