如何创建已取消的任务

远处

我正在编写一个Stream类,并在ReadAsync方法中被阻止。请看一下代码,我认为它可以用英语更好地解释情况。

public override Task<int> ReadAsync(byte[] buffer, int offset, int count, System.Threading.CancellationToken cancellationToken)
{
    if (!cancellationToken.IsCancellationRequested)
    {
        return _connection.ReceiveAsync(new ArraySegment<byte>(buffer, offset, count));
    }
    return // <---------------    what here?
}

使用ILSpy,我可以看到其他Stream类返回了一个已取消的任务,如下所示:

return new Task<TResult>(true, default(TResult), TaskCreationOptions.None, cancellationToken); 

但是,Task的构造函数是内部的,因此我无法调用它。

Google根本没有帮助我。

迈克·斯特罗贝尔

我知道创建已取消任务的最直接方法是使用TaskCompletionSource

var tcs = new TaskCompletionSource<int>();
tcs.TrySetCanceled();
return tcs.Task;

如果您以前从未使用过它,请TaskCompletionSource提供一个“承诺式”任务,该任务基本上可以使您说:“在这里,Task立即进行操作,只要我愿意,我都会提供结果(或报告错误/取消)。准备好了。” 当您要自己安排/协调工作时,这很有用,而不是仅仅依赖于TaskScheduler

另外,如果您使用重写方法async/await,则可以强制取消取消异常自动传播到结果Task

public async override Task<int> ReadAsync(
    byte[] buffer,
    int offset,
    int count,
    CancellationToken cancellationToken)
{
    cancellationToken.ThrowIfCancellationRequested();

    return await _connection.ReceiveAsync(
        new ArraySegment<byte>(
            buffer,
            offset,
            count));
}

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何还原已取消的任务

来自分类Dev

如何为已取消的任务添加延续

来自分类Dev

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

来自分类Dev

Dask-如何取消和重新提交已暂停的任务?

来自分类Dev

任务已取消异常(ThrowForNonSuccess)

来自分类Dev

如何取消挂起的任务?

来自分类Dev

如何批量取消任务?

来自分类Dev

通过CompletionService检查已取消的任务

来自分类Dev

Visual Studio 2013“任务已取消”

来自分类Dev

已取消的任务也显示为已完成

来自分类Dev

TFS 2015:发布工件-“任务已取消”

来自分类Dev

YouTube API上传“任务已取消”

来自分类Dev

无法重新运行已取消的任务

来自分类Dev

非法状态异常:任务已安排或取消

来自分类Dev

HttpClient-任务已取消-如何获取确切的错误消息?

来自分类Dev

如何正确处理Python的`asyncio.gather`中已取消的任务

来自分类Dev

HttpClient-任务已取消-如何获取确切的错误消息?

来自分类Dev

取消任务并将状态设置为“已取消”

来自分类Dev

任务并行库异常处理“任务已取消。”

来自分类Dev

已取消任务时任务仍在运行

来自分类Dev

任务并行库异常句柄“任务已取消。”

来自分类Dev

如何不继续取消的任务?

来自分类Dev

如何使用CancellationToken取消任务?

来自分类Dev

python asyncio,如何从另一个线程创建和取消任务

来自分类Dev

如何确保已取消的Celery任务在所有工作进程全部关闭并返回后永远不会运行

来自分类Dev

如何确保已取消的Celery任务在所有工作进程全部关闭并返回后再也不会运行

来自分类Dev

子级任务已取消,父级已完成?

来自分类Dev

重新启动ScheduledThreadPoolExecutor中的已取消任务

来自分类Dev

等待已取消的任务完成,然后再继续执行

Related 相关文章

  1. 1

    如何还原已取消的任务

  2. 2

    如何为已取消的任务添加延续

  3. 3

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

  4. 4

    Dask-如何取消和重新提交已暂停的任务?

  5. 5

    任务已取消异常(ThrowForNonSuccess)

  6. 6

    如何取消挂起的任务?

  7. 7

    如何批量取消任务?

  8. 8

    通过CompletionService检查已取消的任务

  9. 9

    Visual Studio 2013“任务已取消”

  10. 10

    已取消的任务也显示为已完成

  11. 11

    TFS 2015:发布工件-“任务已取消”

  12. 12

    YouTube API上传“任务已取消”

  13. 13

    无法重新运行已取消的任务

  14. 14

    非法状态异常:任务已安排或取消

  15. 15

    HttpClient-任务已取消-如何获取确切的错误消息?

  16. 16

    如何正确处理Python的`asyncio.gather`中已取消的任务

  17. 17

    HttpClient-任务已取消-如何获取确切的错误消息?

  18. 18

    取消任务并将状态设置为“已取消”

  19. 19

    任务并行库异常处理“任务已取消。”

  20. 20

    已取消任务时任务仍在运行

  21. 21

    任务并行库异常句柄“任务已取消。”

  22. 22

    如何不继续取消的任务?

  23. 23

    如何使用CancellationToken取消任务?

  24. 24

    python asyncio,如何从另一个线程创建和取消任务

  25. 25

    如何确保已取消的Celery任务在所有工作进程全部关闭并返回后永远不会运行

  26. 26

    如何确保已取消的Celery任务在所有工作进程全部关闭并返回后再也不会运行

  27. 27

    子级任务已取消,父级已完成?

  28. 28

    重新启动ScheduledThreadPoolExecutor中的已取消任务

  29. 29

    等待已取消的任务完成,然后再继续执行

热门标签

归档