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

Jac*_*cko 1 c# sockets asynchronous system threadpool

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

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

socket.set_asynch("FOO","bar");
string rc = socket.get_asynch("FOO");
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

dtb*_*dtb 6

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

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

    public Task<string> GetAsync(string key);
}
Run Code Online (Sandbox Code Playgroud)

这两种方法都将使用异步IO来执行相应的操作,并在操作完成时将返回的Task <T>设置为已完成.

那么你可以像这样同步使用你的类:

var dht = new DistributedHashTable(...);

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

Console.WriteLine(dht.GetAsync("FOO").Result);
Run Code Online (Sandbox Code Playgroud)

或者像这样异步:

var dht = new DistributedHashTable(...);

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

或异步使用Async CTP,如下所示:

var dht = new DistributedHashTable(...);

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

Console.WriteLine(await dht.GetAsync("FOO"));
Run Code Online (Sandbox Code Playgroud)