2012-03-20 42 views
0

我有一个WCF服务正在处理一个调用,将处理后的数据发送到另一个服务,并通过发起回调来提醒调用者和该应用程序的任何其他实例。最初,回调被称为最后,但我发现,如果第二个服务没有运行,那么我们试图发现它时会有二十秒的延迟。只有这样的回调才叫。我在呼叫第二个服务之前移动了回叫通知,但它仍然有延迟。我甚至试图在后台进程中触发回调,但这也不起作用。除了改变发现的超时之外,是否有办法避开这种延迟?这是一段代码片段。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); 
} 

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); 
    } 
} 

回答

1

你有没有考虑缓存的结果?