मेरे पास एक एप्लिकेशन (.NET 4.0) है जो स्टार्टअप पर व्यवस्थापकीय डेटा लोड करता है। मुझे 25 समवर्ती एसिंक डब्ल्यूसीएफ कॉल करना है, उनमें से कुछ त्वरित (40 एमएमएस) हैं, कुछ अन्य 882 एमएस तक निष्पादित करने में अधिक समय लेते हैं। मैं स्थानीय रूप से डेटा स्टोर करने की योजना बना रहा हूं, लेकिन पहले एप्लिकेशन स्टार्टअप के लिए, इसे यथासंभव जल्दी से किया जाना चाहिए।25 समवर्ती एसिंक डब्ल्यूसीएफ कार्य का उपयोग करके ऑर्केस्ट्रेट करने के लिए कॉल करता है
यह ध्यान दिया जाना चाहिए कि प्रॉक्सी लाइब्रेरी लक्ष्यीकरण .NET 3.5 में हैं और आंतरिक रूप से जेनरी रिचटर के असिनक एन्यूमेरेटर की सहायता से एसिंक विधि में लिपटे BeginXxx और EndXxx विधियों पैटर्न का उपयोग कर रहे हैं।
प्रत्येक ग्राहक प्रॉक्सी के लिए डब्ल्यूसीएफ चैनल कारखानों का उपयोग किया जाएगा जो कॉल लॉन्च करने से पहले खोले जाएंगे।
इस समय, मैं प्रत्येक एसिंक कॉल लॉन्च करने वाली एक क्रिया के साथ कार्य। फैक्टरी.स्टार्टन्यू का उपयोग कर रहा हूं। अनुभव निम्न है:
- सभी BeginXXX कॉल सभी भेजे गए हैं।
- प्रोग्राम कम से कम 10 सेकंड के लिए मेरे कोड के बाहर काम करता प्रतीत होता है।
- आखिर में सभी एंडोक्सएक्स कॉल परिणामों को पुनः प्राप्त करने के लिए भेजे जाते हैं।
मुझे आश्चर्य है कि ऐसी देरी क्यों होती है। मेरे कंप्यूटर में 4 कोर हैं, यदि समवर्ती कॉल की संख्या 4 तक सीमित है, तो कोई देरी नहीं है, जैसे ही मैं एक और कॉल जोड़ता हूं, देरी का अनुभव होता है।
किसी भी मदद की सराहना की।
संपादित करें 1: बाध्यकारी उपयोग netTcp बाइंडिंग है।
सर्वर विन्यास पीछा कर रहा है:
<netTcpBinding>
<binding transactionFlow="true" listenBacklog="500" maxReceivedMessageSize="400000"
portSharingEnabled="false">
<readerQuotas maxDepth="200" />
<reliableSession enabled="false" />
<security mode="None">
<transport clientCredentialType="None" protectionLevel="None" />
<message clientCredentialType="None" />
</security>
</binding>
</netTcpBinding>
<service name="AdminService">
<endpoint address="" binding="netTcpBinding" bindingConfiguration=""
contract="IAdmin">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexTcpBinding" bindingConfiguration=""
contract="IMetadataExchange" />
</service>
संपादित 2: के बाद डिफ़ॉल्ट थ्रॉटलिंग मूल्यों एक 4 कोर मशीन पर WCF 4.5 क्रम द्वारा निर्धारित कर रहे हैं।
ListenBacklog is [500]
MaxConnections is [48]
MaxConcurrentCalls is [64]
MaxConcurrentInstances is [2147483647]
MaxConcurrentSessions is [400]
संपादित 3: यहाँ J.Richter के AsyncEnumerator का उपयोग कर कोड है:
private IEnumerator<int> DoWorkGetXXXX(AsyncEnumerator<MyResult> ae)
{
ae.ThrowOnMissingDiscardGroup(true);
IClientChannel proxy = (IClientChannel)CreateChannel(_bindingName);
bool success = false;
try
{
proxy.Open();
// The call to BeginXXX goes here
((IAcaccount)proxy).BeginGetXXX(..., ae.EndVoid(0, DiscardGetXXX), proxy);
//
yield return 1;
if (ae.IsCanceled())
{
goto Complete;
}
// Iterator was not canceled, process should continue.
// The call to EndXXX goes here
IAsyncResult ar = ae.DequeueAsyncResult();
try
{
ae.Result = ((IAcaccount)ar.AsyncState).EndGetXXX(ar);
proxy.Close();
success = true;
}
// In the mean time, we catch and rethrow :)
// If this exception occurs, we should retry a call to the service
catch (FaultException<AppFabricCachingException> retry)
{
}
// fatal Exception in data service, administrator action required...
catch (FaultException<EFExecutionException> fatal)
{
}
catch (FaultException<EFUpdateException> fatal)
{
}
catch (FaultException<EFNoRowException> nr)
{
}
catch (FaultException fe)
{
}
catch (ServiceActivationException sae)
{
}
catch (CommunicationException ce)
{
}
//
}
finally
{
// If an error occurred, abort the proxy.
if (!success)
{
proxy.Abort();
}
}
// End of operations.
Complete:
proxy = null;
}
इससे मदद मिल सकती है, यह एक कनेक्शन समस्या हो सकती है http://social.msdn.microsoft.com/Forums/en-US/netfxnetcom/thread/1f863f20-09f9-49a5-8eee-17a89b591007 – codingadventures
आपका बाध्यकारी क्या है? सर्वर विन्यास? क्या आप सर्वर कॉन्फ़िगरेशन पोस्ट कर सकते हैं? – evgenyl
@ जॉनफिल्ड मैंने अपना प्रश्न संपादित किया है, मैं netTcp बाइंडिंग का उपयोग कर रहा हूं। –