我想使用异步 io 与分布式哈希服务器进行套接字通信。环境是 C# 3.5,但如果需要可以使用 4.0。
假设我发出以下异步命令(伪代码):
socket.set_asynch("FOO","bar");
string rc = socket.get_asynch("FOO");
由于asynchronous io使用了系统线程池,所以这两个命令可能运行在两个 不同的线程。如何确保 rc 等于“bar”?即第一个命令 在发出第二个命令之前发出?
谢谢!
最佳答案
您可以围绕 Task<T> class 设计您的 API (任务并行库):
class DistributedHashTable
{
public Task SetAsync(string key, string value);
public Task<string> GetAsync(string key);
}
这两种方法都将使用异步 IO 来执行相应的操作,并在操作完成时将返回的 Task
然后你可以像这样同步使用你的类:
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"));
关于C#异步IO : Is there a way of ensuring ordering of tasks?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4362158/