【问题标题】:C# Asynchronous IO: Is there a way of ensuring ordering of tasks?C# 异步 IO:有没有办法确保任务的顺序?
【发布时间】:2011-05-20 17:10:14
【问题描述】:

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

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

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

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

谢谢!

【问题讨论】:

  • 使用同步IO?
  • @ChaosPandion:我笑了,但这是真的。
  • 您是否有理由不使用框架来控制异步行为?
  • 嗯........asynch 意味着如果需要,我可以在 set 和 get 之间做一些事情,而不是等待网络回应。

标签: c# sockets asynchronous system threadpool


【解决方案1】:

您可以围绕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"));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-13
    • 2021-06-23
    • 2019-06-30
    • 2018-04-21
    相关资源
    最近更新 更多