Как использовать BlockingCollection <'a> .TryTake в F # - PullRequest
3 голосов
/ 08 февраля 2011

Как мне использовать метод TryTake для BlockingCollection <'a>, проходящий через тайм-аут в миллисекундах?

Вот подпись:

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

возможно ли использовать метод Tuple, чтобы избежать передачи типа ref, как в методах Dictionary.TryGet?

то есть
пусть успех, item = myDictionary.TryGetValue (клиент)

Я борюсь с этой конкретной подписью, любые предложения будутотлично.

ура!

1 Ответ

3 голосов
/ 08 февраля 2011

Я считаю, что вы можете использовать эту технику только для 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)
...