WCF发现减慢了回调的处理

WCF发现减慢了回调的处理,wcf,callback,discovery,Wcf,Callback,Discovery,我有一个WCF服务,它正在处理一个调用,将处理后的数据发送到另一个服务,并通过启动回调来提醒调用方和该应用程序的任何其他实例。最初回调是在最后被调用的,但是我发现如果第二个服务没有运行,那么在我们试图发现它时会有二十二秒的延迟。直到那时,才调用回调。我在调用第二个服务之前移动了回调通知,但它仍然有延迟。我甚至尝试在后台进程上启动回调,但也不起作用。除了更改发现的超时时间外,是否还有其他方法可以绕过此延迟?下面是一段代码片段 // Alert the admins of the change. i

我有一个WCF服务,它正在处理一个调用,将处理后的数据发送到另一个服务,并通过启动回调来提醒调用方和该应用程序的任何其他实例。最初回调是在最后被调用的,但是我发现如果第二个服务没有运行,那么在我们试图发现它时会有二十二秒的延迟。直到那时,才调用回调。我在调用第二个服务之前移动了回调通知,但它仍然有延迟。我甚至尝试在后台进程上启动回调,但也不起作用。除了更改发现的超时时间外,是否还有其他方法可以绕过此延迟?下面是一段代码片段

// Alert the admins of the change.
if (alertPuis)
{
    ReportBoxUpdated(data.SerialNumber);
}

// Now send the change to the box if he's online.
var scope = new Uri(string.Format(@"net.tcp://{0}", data.SerialNumber));
var boxAddress = DiscoveryHelper.DiscoverAddress<IAtcBoxService>(scope);
if (boxAddress != null)
{
    var proxy = GetBoxServiceProxy(boxAddress);

    if (proxy != null)
    {
        proxy.UpdateBox(boxData);
    }
    else
    {
        Log.Write("AtcSystemService failed on call to update toool Box: {0}",       
                  data.SerialNumber);
    }
}
else if (mDal.IsBoxDataInPendingUpdates(data.SerialNumber) == false)
            mDal.AddPendingUpdate(data.SerialNumber, null, true, null);
}
//将更改通知管理员。
如果(警报PUIS)
{
ReportBoxUpdate(data.SerialNumber);
}
//如果他在线,现在把零钱送到盒子里。
var scope=newURI(string.Format(@“net.tcp://{0}”,data.SerialNumber));
var-boxAddress=DiscoveryHelper.DiscoverAddress(范围);
if(boxAddress!=null)
{
var proxy=GetBoxServiceProxy(boxAddress);
如果(代理!=null)
{
proxy.UpdateBox(boxData);
}
其他的
{
Log.Write(“调用AtcSystemService更新toool框时失败:{0}”,
数据序列号);
}
}
else if(mDal.isboxDataInPendingUpdate(data.SerialNumber)==false)
mDal.AddPendingUpdate(data.SerialNumber,null,true,null);
}

private static void ReportBoxUpdated(字符串序列号)
{
var badCallbacks=新列表();
Action invoke=callback=>
callback.OnBoxUpdated(serialNumber);
foreach(AdminCallbacks中的调用变量)
{
var callback=回调。值为IATCSystems服务回调;
尝试
{
调用(回调);
}
捕获(例外情况除外)
{
Log.Write(“未能执行管理员实例{0}:{1}的回调”,
返回键,例如消息);
添加(callback.Key);
}
}
foreach(badCallbacks中的var bad)//从列表中清除所有过时的回调。
{
AdminCallbacks.Remove(坏);
}
}

您是否考虑过缓存结果

private static void ReportBoxUpdated(string serialNumber)
{
    var badCallbacks = new List<string>();

    Action<IAtcSystemServiceCallback> invoke = callback => 
        callback.OnBoxUpdated(serialNumber);
    foreach (var theCallback in AdminCallbacks)
    {
        var callback = theCallback.Value as IAtcSystemServiceCallback;
        try
        {
             invoke(callback);
        }
        catch (Exception ex)
        {
             Log.Write("Failed to execute callback for admin instance {0}: {1}", 
                   theCallback.Key, ex.Message);
             badCallbacks.Add(theCallback.Key);
        }
    }

    foreach (var bad in badCallbacks)  // Clean out any stale callbacks from the list.
    {
        AdminCallbacks.Remove(bad);
    }
}