一些电子问题:
一个。如何以雄辩的方式将并行处理形成的列表直接添加到并发结果数组中。
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
答案 0 :(得分:3)
A。您无法在Array.append
上使用results
,因为results
是ConcurrentBag
,但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上的所有内容都可以免费获得(参见上面的链接)或者您喜欢的代码编辑器中的自动完成/智能感知。