如何在F#中使用BlockingCollection<'a> .TryTake

时间:2011-02-07 22:56:16

标签: f# tuples task-parallel-library

如何在BlockingCollection上使用TryTake方法<'a>以毫秒为单位传递超时时间?

继承人签名:

BlockingCollection.TryTake(item:byref,millisecondsTimeout:int):bool

是否可以使用Tuple方法避免像Dictionary.TryGet方法那样传递ref类型?

即。
让成功,item = myDictionary.TryGetValue(客户端)

我正在努力争取这个特殊的签名,任何建议都会很棒。

干杯!

1 个答案:

答案 0 :(得分:3)

我相信您只能对参数列表的 end 中出现的byref参数使用该技术(这类似于可选参数的规则)。因此,如果使用签名BlockingCollection.TryTake定义了int * 'T byref -> bool,那么它会起作用,但由于它定义为'T byref * int -> bool,因此不会。

例如:

open System.Runtime.InteropServices

type T =
  static member Meth1(a:int, [<Out>]b:string byref, [<Out>]c:bool byref) : char = 
    b <- sprintf "%i" a
    c <- a % 2 = 0
    char a
  static member Meth2([<Out>]b:string byref, [<Out>]c:bool byref, a:int) : char = 
    b <- sprintf "%i" a
    c <- a % 2 = 0
    char a

//  ok
let (r,b,c) = T.Meth1(5)
//  ok
let (r,c) = T.Meth1(5,ref "test")
// ok
let r = T.Meth1(5, ref "test", ref true)
// doesn't compile
let (r,b,c) = T.Meth2(5)
// doesn't compile
let (r,c) = T.Meth2(ref "test", 5)
// ok
let r = T.Meth2(ref "test", ref true, 5)