如何创建可取消的任务循环?

罗杰·约翰逊

是否可以使用System.Threading.Task.Task创建可以取消的任务循环?

该流程应从Task.Delay(x ms)开始,然后继续用户定义的任务,然后是另一个Task.Delay(y ms),然后从用户定义的任务重复。

var result = Task.Delay(initialDelay)
              .ContinueWith(t => dostuff..)
              .ContinueWith what goes here?

使用任务甚至可行吗?

我可以启动一个计时器并完成它,但是如果需要取消,使用任务似乎是正确的方法,不是吗?

务实的

await 使这个超级容易:

public async Task TimedLoop(Action action, 
    CancellationToken token, TimeSpan delay)
{
    while (true)
    {
        token.ThrowIfCancellationRequested();
        action();
        await Task.Delay(delay, token);
    }
}

如果没有async(但仍仅使用TPL),则有点麻烦。我通常通过将自己附加到类型变量上的延续来解决此问题Task这可以正常工作,但是可能需要花一秒钟的时间才能将其缠绕在头上。没有await它,使用aTimer代替可能会更容易

public Task TimedLoop(Action action,
    CancellationToken token, TimeSpan delay)
{
    //You can omit these two lines if you want the method to be void.
    var tcs = new TaskCompletionSource<bool>();
    token.Register(() => tcs.SetCanceled());

    Task previous = Task.FromResult(true);
    Action<Task> continuation = null;
    continuation = t =>
    {
        previous = previous.ContinueWith(t2 => action(), token)
            .ContinueWith(t2 => Task.Delay(delay, token), token)
            .Unwrap()
            .ContinueWith(t2 => previous.ContinueWith(continuation, token));
    };
    previous.ContinueWith(continuation, token);
    return tcs.Task;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使UdpClient.ReceiveAsync()可取消?

来自分类Dev

如何使UdpClient.ReceiveAsync()可取消?

来自分类Dev

如何使异步池可取消?

来自分类Dev

如何通过Tornado HTTP服务器上的HTTP使长任务“可取消”?

来自分类Dev

公开可取消任务API的正确方法

来自分类Dev

公开可取消任务API的正确方法

来自分类Dev

通知不可取消

来自分类Dev

可取消的文件下载

来自分类Dev

可取消的线程队列

来自分类Dev

如何使方法可取消而不使其变得丑陋?

来自分类Dev

如何在Android中设置可取消的超时

来自分类Dev

如何使方法可取消而不使其变得丑陋?

来自分类Dev

无需等待完成即可取消 proxychecker 中的协程/任务

来自分类Dev

Android可取消的启动画面

来自分类Dev

可取消的异步Web请求

来自分类Dev

存储过程不可取消

来自分类Dev

列表迭代器不可取消

来自分类Dev

如何通过按钮使不可取消的进度对话框被取消?

来自分类Dev

System.ComponentModel.CancelEventHandler如何工作?我不知道什么是可取消的活动?

来自分类Dev

新的Tkinter窗口打开时如何运行可取消功能

来自分类Dev

System.ComponentModel.CancelEventHandler如何工作?我不知道什么是可取消的活动?

来自分类Dev

如何在可取消请求流中重复使用单个异步 Web 服务调用?

来自分类Dev

如何为标准对话框 PreferenceFragmentCompat 设置可取消(false)

来自分类Dev

取消Kotlin中不可取消的协程

来自分类Dev

使用MVVM管理可取消的部分更新

来自分类Dev

单击即可取消折叠Android的CollapsingToolbarLayout

来自分类Dev

无需手动输入即可取消设置

来自分类Dev

C ++相邻查找:向量迭代器不可取消

来自分类Dev

安排可取消脚本在持续时间后运行

Related 相关文章

热门标签

归档