c# - How to cancel a task from a TaskCompletionSource? -
i'm trying create async producerconsumercollection , that, i'm using msdn page (http://msdn.microsoft.com/en-us/library/hh873173.aspx (bottom of page)).
i'm trying add timeout, here :
public async task<t> takewithtimeout(int timeout) { task<t> taketask = this.take(); if (timeout <= 0 || taketask == await task.whenany(this.tasks.take(), task.delay(timeout))) { return await taketask; } else { // timeout return default(t); } } }
the problem code that, in case of timeout, not cancel task created take() method.
since task has been "created" taskcompletionsource, cannot give cancellationtoken?
so, how proceed cancel , implement take timeout ?
thanks :)
writing cancel-safe async
-friendly producer/consumer collection non-trivial. need change take
accept cancellationtoken
parameter, , should register handler when cancelled taskcompletionsource
cancelled.
i highly recommend use bufferblock<t>
, has cancellation support built-in.
if can't use tpl dataflow (e.g., you're working in pcl or have target platforms unsupported dataflow), can use producer/consumer collections in open-source asyncex library (such asyncproducerconsumerqueue
or asynccollection
). these both based on asynclock
, asyncconditionvariable
, design describe briefly on blog (which not cancellation details). key behind supporting cancellation in producer/consumer collection design support cancellation in asyncconditionvariable.waitasync
; once condition variable type supports cancellation, collection support it, too.
Comments
Post a Comment