2010-12-06 2 views
1

Я хотел бы использовать асинхронный io для связи сокетов с распределенным хеш-сервером. Среда - C# 3.5, но при необходимости может использовать 4.0.C# Asynchronous IO: Есть ли способ обеспечить упорядочение задач?

Предположим, я выдавать следующие асинхронные команды (в псевдокоде):

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

Так как асинхронный IO использует пул потоков системы, эти две команды могут быть запущены на двух разных потоков. Как я могу гарантировать, что rc равно «bar»? то есть первая команда выдается до выдачи второй команды?

Спасибо!

+8

использования синхронного ввода-вывода ? – ChaosPandion

+1

@ChaosPandion: Я lol'd, но это правда. –

+0

Есть ли причина, по которой вы не используете Framework для управления асинхронным поведением? –

ответ

6

Вы можете создать свой API вокруг (Task Parallel Library) Task<T> class:

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

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

Оба метода будет использовать асинхронный ввод-вывод для выполнения соответствующей операции, и установите возвращенный Task <T> до завершения, когда операции закончил.

Тогда вы могли бы использовать свой класс синхронно, как это:

var dht = new DistributedHashTable(...); 

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

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

или асинхронно, как это:

var dht = new DistributedHashTable(...); 

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

или асинхронно с помощью Async CTP так:

var dht = new DistributedHashTable(...); 

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

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

+1 для тщательности! Ваш 34.9k хорошо заработал. – Jacko

Смежные вопросы