小编Rob*_*idt的帖子

使用Rx Repeat()和Replay()缓存并重新启动DNS查询

我是一个Rx新手,所以我希望你能忍受我.作为我自己的练习,也可能是我可以为同事演示的样本,我为Dns.BeginGetHostEntry()/ EndGetHostEntry()完成了两个包装类:DnsResolver和DnsResolverRx.

每个类都有一个公共静态方法:

void Resolve(string host, Action<IPHostEntry> getResult, Control context = null);
Run Code Online (Sandbox Code Playgroud)

...以及使其变得有趣的一些其他要求:1.如果提供了上下文,则必须在关联的线程2上调用getResult.对于MaxResultAge秒,将缓存同一主机的先前结果.

非Rx版本工作正常,但与此问题并不真正相关.Rx版本如下所示:

class DnsResolverRx
{
  static Func<string, IObservable<IPHostEntry>> _resolver = Observable.FromAsyncPattern<string, IPHostEntry>(Dns.BeginGetHostEntry, Dns.EndGetHostEntry);

  public static void Resolve(string host, Action<IPHostEntry> setResult, Control context = null)
  {
    IObservable<IPHostEntry> result;
    result = _cache.GetOrCreateValue( // a trivial TryGetValue wrapper
      host,
      () => _resolver(host)
        .Do(e => Debug.WriteLine("resolved"))
        .Repeat()
        .Do(e => Debug.WriteLine("repeated"))
        .Replay(MaxResultAge)
        .RefCount()
    );

    result = result.Take(1); // each request needs only 1 result

    if (context != null)
      result = result.ObserveOn(context);

    result.Subscribe(
      entry …
Run Code Online (Sandbox Code Playgroud)

system.reactive

3
推荐指数
1
解决办法
1500
查看次数

有没有办法用Petrel 2012.1 64位进行调试?

启动调试器时,Visual Studio会挂起大约20秒,然后终止调试会话,而不会发出任何警告.

32位版本工作正常,但如果我们的插件使用来自第三方的64位本机代码则不行.

作为开发人员,我暂时在我的工作站上坚持使用Petrel 2012.1 - 可能会在以后的版本中修复问题吗?

ocean petrel

2
推荐指数
1
解决办法
701
查看次数

标签 统计

ocean ×1

petrel ×1

system.reactive ×1