C # Асинхронный ввод-вывод: есть ли способ обеспечить упорядочение задач? - PullRequest
1 голос
/ 06 декабря 2010

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

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

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

Поскольку асинхронный io использует пул системных потоков,Команды могут выполняться в двух разных потоках.Как я могу убедиться, что rc равен "bar"?то есть, что первая команда была введена до того, как была введена вторая?

Спасибо!

1 Ответ

6 голосов
/ 06 декабря 2010

Вы можете создать свой API для класса Задача (Библиотека параллельных задач):

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

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

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

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

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"));
...