代码之家  ›  专栏  ›  技术社区  ›  FacticiusVir

如何将异步操作与.NET4中的任务并行库链接起来?

  •  17
  • FacticiusVir  · 技术社区  · 14 年前

    首先,我将异步调用包装在如下任务中:

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

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

    但是没有一个版本的 Task.ContinueWith TaskFactory.FromAsync .

    所以,假设我坚持使用第三方语言,我要寻找的是这个方法的正确实现:

    public static Task ChainWrite(Stream stream, byte[] data, Task precedingTask)
    {
        //?
    }
    
    3 回复  |  直到 14 年前
        1
  •  12
  •   FacticiusVir    14 年前

    到目前为止,我的最佳想法是连锁创建新的写入任务,然后使用展开扩展方法 Task<Task> Task :

    public static Task ChainWrite(Stream stream, byte[] data, Task precedingTask)
    {
        return precedingTask.ContinueWith(x => CreateWriteTask(stream, data)).Unwrap();
    }
    
        2
  •  3
  •   Robert Jeppesen    14 年前

    据我所知,这是一个不幸的后果,无法控制何时开始一项任务。

    precedingTask.ContinueWith(Task nextTask)
    

    因为一旦创建,它可能已经开始时,你得到'继续'。此外,它也会使类型混乱。这里应该是什么类型:

    precedingTask<T>.ContinueWith(Task<..what?..> nextTask)
    

    前一个返回一个T,那么下一个取什么,返回什么?:)不过,这可以通过闭包来解决。

        3
  •  1
  •   abatishchev Marc Gravell    12 年前

    尝试 ContinueWhenAll() ContinueWhenAny() 而不是 ContinueWith() . 看到了吗 here .