2011-02-07 1 views
3

Comment procéder en utilisant la méthode TryTake sur un BlockingCollection < 'a> passant dans un délai d'attente en millisecondes?Comment consommer BlockingCollection <'a> .TryTake in F #

Heres la signature:

BlockingCollection.TryTake (unité: byref, millisecondsTimeout: int): bool

est possible d'utiliser la méthode de nuplet d'éviter le passage d'un type de réf comme sur les méthodes Dictionary.TryGet?

dire
laisser le succès, item = myDictionary.TryGetValue (client)

Im aux prises avec cette signature particulière, toute suggestion serait génial.

À la votre!

Répondre

3

Je crois que vous ne pouvez utiliser cette technique que pour byref paramètres qui se produisent à l'fin de la liste des paramètres (ce qui est similaire à la règle pour les paramètres facultatifs). Donc, si BlockingCollection.TryTake ont été définis avec la signature int * 'T byref -> bool cela fonctionnera, mais comme il est défini comme 'T byref * int -> bool, il ne le sera pas.

Par exemple:

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) 
+2

Étant donné que, si je devais faire beaucoup de travail avec BlockingCollection de F #, je serais probablement faire une surcharge de méthode d'extension de TryTake qui accepte un entier et retourne un tuple. –

+0

Je dois regarder cela parce que je vais l'utiliser un peu, a réussi à me confondre en créant le ** ref T ** qui est passé dans – 7sharp9

Questions connexes