2010-12-06 50 views
1

Je voudrais utiliser io asynchrone pour la communication par socket avec un serveur de hachage distribué. L'environnement est C# 3.5, mais pourrait utiliser 4.0 si nécessaire.C# IO asynchrone: existe-t-il un moyen d'assurer la commande des tâches?

suppose que j'émettre les commandes asynchrones suivantes (en pseudocode):

socket.set_asynch("FOO","bar"); 
string rc = socket.get_asynch("FOO"); 

Depuis asynchrone io utilise le pool de threads du système, les deux commandes peuvent être exécutées sur deux différents threads. Comment puis-je m'assurer que rc est égal à "bar"? c'est-à-dire que la première commande est émise avant l'émission de la seconde commande?

Merci!

+8

Utilisez IO synchrone ? – ChaosPandion

+1

@ChaosPandion: Je lol'd, mais c'est vrai. –

+0

Y a-t-il une raison pour laquelle vous n'utilisez pas le Framework pour contrôler le comportement asynchrone? –

Répondre

6

Vous pouvez concevoir votre API autour de la Task<T> class (Task Parallel Library):

class DistributedHashTable 
{ 
    public Task SetAsync(string key, string value); 

    public Task<string> GetAsync(string key); 
} 

Les deux méthodes utilisent IO asynchrones pour effectuer l'opération respective, et définissez la tâche < retourné T > à remplir lorsque l'opération avoir fini.

Ensuite, vous pouvez utiliser votre classe synchroniquement comme ceci:

var dht = new DistributedHashTable(...); 

dht.SetAsync("FOO", "bar").Wait(); 

Console.WriteLine(dht.GetAsync("FOO").Result); 

ou de manière asynchrone comme ceci:

var dht = new DistributedHashTable(...); 

dht.SetAsync("FOO", "bar") 
    .ContinueWith(t => dht.GetAsync("FOO")) 
    .Unwrap() 
    .ContinueWith(t => { 
          Console.WriteLine(t.Result); 
         }); 

ou en mode asynchrone via le Async CTP comme ceci:

var dht = new DistributedHashTable(...); 

await dht.SetAsync("FOO", "bar"); 

Console.WriteLine(await dht.GetAsync("FOO")); 
+0

+1 pour la rigueur! Votre 34.9k a été bien mérité. – Jacko