Task.WhenAny会取消注册未完成的任务吗?

时间:2013-03-07 16:05:09

标签: c# asynchronous mono task-parallel-library async-await

考虑一个具有某种生命的类。在此生命周期中,事件可能会发生任意次数,并且通过完成任务(在事件之后续订)来发出事件信号。该对象也可能被关闭,结束其生命周期。通过完成任务也会发出关机信号。它也可能永远存在。

现在考虑对对象的生命周期建模的某种异步工作流:

//will be completed on Shutdown. Is the same object for the entire lifetime.
Task shutdownTask = ... 

while(true)
{
    //will be completed when the event occurs. Is different on each loop.
    Task eventTask = ... 

    if (await Task.WhenAny(shutdownTask, eventTask) == eventTask)
    {
        //Event has occured
        ...
    }
    else
    {
        //Object has been shutdown. React and leave.
        ...
        return;
    }
}

eventTask的一个示例可能是异步从异步队列中取消对象。

直观地说,我发现用这种方式建模对象的生命周期并没有错。但是,该对象可能永远存在,并且在shutdownTask上注册了无限数量的延续。或者是他们?将继续注销还是应用程序最终会爆炸?是否有更清晰的模式来模拟这样的控制流程?

1 个答案:

答案 0 :(得分:3)

是的,当其中任何一个任务触发时,将从所有给定的任务中删除继续。