如何使用.NET 4中的任务并行库链接异步操作?

Fac*_*Vir 17 .net c# task-parallel-library

我正在尝试以编程方式将C#4中的异步操作链接起来,例如写入给定的Stream对象.我最初是"手动"执行此操作,将回调挂钩从一个操作到下一个操作,但我想我会尝试使用.NET 4任务并行库来省去重新发明并发轮的麻烦.

首先,我将异步调用包装在Tasks中,如下所示:

public static Task CreateWriteTask(Stream stream, byte[] data)
{
    return Task.Factory.FromAsync(stream.BeginWrite, stream.EndWrite, data, 0, data.Length, null);
}
Run Code Online (Sandbox Code Playgroud)

Continuations使链接同步操作变得非常容易(如果您原谅不幸的方法名称):

public static Task ChainFlush(Stream stream, Task precedingTask)
{
    return precedingTask.ContinueWith(x => stream.Flush());
}
Run Code Online (Sandbox Code Playgroud)

但是没有任何版本的Task.ContinueWith方法可以像接受同样的方式接受异步操作TaskFactory.FromAsync.

所以,假设我坚持使用TPL,我正在寻找这种方法的正确实现:

public static Task ChainWrite(Stream stream, byte[] data, Task precedingTask)
{
    //?
}
Run Code Online (Sandbox Code Playgroud)

Fac*_*Vir 12

到目前为止,我最好的想法是链接新写入任务的创建,然后使用Unwrap扩展方法Task<Task>转回Task:

public static Task ChainWrite(Stream stream, byte[] data, Task precedingTask)
{
    return precedingTask.ContinueWith(x => CreateWriteTask(stream, data)).Unwrap();
}
Run Code Online (Sandbox Code Playgroud)