如何让动画变得可等待?

mor*_*eus 2 c# async-await

很抱歉无法给出更准确的标题,但这就是我想做的。我有一个方法foo可以启动一些 UI 动画。当这些动画完成时,我想发出该方法完成的信号。但我不想通过事件发出完成信号,而是想创建方法awaitable。如何才能做到这一点?

void foo()
{  
  // start some animations 
   storyboard.Begin();
   storyboard.Completed += (s, e) => { // signal that foo has completed }
}
Run Code Online (Sandbox Code Playgroud)

调用代码应该可以这样写:

await foo();
Run Code Online (Sandbox Code Playgroud)

我的实际情况foo比上面的插图更复杂,因为我有一系列动画,它们依次发生,并且foo应该在所有动画完成时完成。

Jam*_*ing 6

通常,基于事件完成的事情会通过使用 TaskCompletionSource 进行“包装”。不幸的是,MSDN 上的示例(恕我直言)过于复杂,而不仅仅是单个实例+事件。你会有类似的东西:

public Task Foo()
{
    var tcs = new TaskCompletionSource<bool>();
    storyboard.Begin();
    storyboard.Completed += (s, e) => tcs.SetResult(true);
    return tcs.Task;
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,并不真正需要 TResult,但 TaskCompletionSource 似乎没有非通用版本,我不确定等效模式是什么