我是一个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) 启动调试器时,Visual Studio会挂起大约20秒,然后终止调试会话,而不会发出任何警告.
32位版本工作正常,但如果我们的插件使用来自第三方的64位本机代码则不行.
作为开发人员,我暂时在我的工作站上坚持使用Petrel 2012.1 - 可能会在以后的版本中修复问题吗?