C#异步IO:有没有办法确保任务的排序?

时间:2010-12-06 00:09:50

标签: c# sockets asynchronous system threadpool

我想使用异步io与分布式哈希服务器进行套接字通信。环境是C#3.5,但如果需要可以使用4.0。

假设我发出以下异步命令(伪代码):

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

由于异步io使用系统线程池,因此这两个命令可以在两个上运行 不同的线程。我怎样才能确保rc等于“bar”?即第一个命令 在第二个命令发出之前发出?

谢谢!

1 个答案:

答案 0 :(得分:6)

您可以围绕Task<T> class(任务并行库)设计API:

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

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

两种方法都将使用异步IO来执行相应的操作,并设置返回的任务&lt; T&gt;。在操作完成时完成。

然后你可以像这样同步使用你的课程:

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