C#异步IO : Is there a way of ensuring ordering of tasks?

标签 c# sockets asynchronous system threadpool

我想使用异步 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/

相关文章:

c# - 如何使用 C# API 定义-fun

python - 检测 TCP 套接字上是否调用了 `connect()`

javascript - Socket.io-client 触发重复的 'reconnect_failed' 事件

java - 查找: java. io.IOException的确切原因和解决方案:现有连接被远程主机强制关闭

swift - 当主线程等待运行时,Alamofire 从不调用 encodingCompletion 来使用 MultipartFormData 进行上传

iphone - 我们有什么理由不使用 UIImageView 的子类吗?

c++ - 使用fork()和boost::asio的进程池

c# - 减少文件操作的内存占用

c# - NServiceBus 升级 2.5 到 3.2 总是重新安装 MSMQ,有没有办法阻止这个?

c# - 如何在 Swashbuckle 中更改 POST 和 PUT 的必填字段?