并行处理后将结果附加到数组

时间:2018-04-03 07:52:40

标签: parallel-processing f#

一些电子问题:

一个。如何以雄辩的方式将并行处理形成的列表直接添加到并发结果数组中。

let results = System.Collections.Concurrent.ConcurrentBag<string>()
let tasks = System.Collections.Generic.List<string>()
tasks.add("a")
tasks.add("b")

let answers = tasks
        |> Seq.map asyncRequest
        |> Async.Parallel
        |> Async.RunSynchronously
        |> Array.toList

Array.append results answers

尝试有没有办法通过管道运营商追加?

let answers = tasks
        |> Seq.map asyncRequest
        |> Async.Parallel
        |> Async.RunSynchronously
        |> Array.append results

B中。有没有办法通过List构造函数添加项目?

let tasks = System.Collections.Generic.List<string>()
tasks.add("a")
tasks.add("b")

℃。有没有办法使用Queue构造函数从数组构造队列?

let items: string[] = [|"a", "b", "c"|]
let jobs = System.Collections.Generic.Queue<string>()

items |> Array.map jobs.Enqueue |> ignore

1 个答案:

答案 0 :(得分:3)

A。您无法在Array.append上使用results,因为resultsConcurrentBag,但Array.append预计它的论点是Array。要将内容添加到ConcurrentBag,请使用其Add method。逐个添加项目:

tasks
    |> Seq.map asyncRequest
    |> Async.Parallel
    |> Async.RunSynchronously
    |> Array.iter results.Add

逐个添加项目效率有点低。如果您的ConcurrentBag确实是在同一个函数中创建的,正如您的示例所示,您可以考虑使用其constructor that takes an IEnumerable<T>

let answers = tasks
    |> Seq.map asyncRequest
    |> Async.Parallel
    |> Async.RunSynchronously

let results = System.Collections.Concurrent.ConcurrentBag<string>( answers )

B。是的,有一种方法可以将内容添加到System.Collections.Generic.List<T>。此类为此目的提供a handy Add method

tasks.Add "a"
tasks.Add "b"

将参数括在括号中(如在您的尝试中)并非必要,但允许:

tasks.Add("a")
tasks.Add("b")

C。是的,有一种方法可以从数组构造队列。 Queue类有a constructor that takes an IEnumerable<T>,数组实现IEnumerable<T>,因此您可以在数组上调用该构造函数:

let jobs = System.Collections.Generic.Queue<string>( items )

请注意您几乎无需我的帮助即可获得上述任何信息。 MSDN上的所有内容都可以免费获得(参见上面的链接)或者您喜欢的代码编辑器中的自动完成/智能感知。