async-await का उपयोग कर एक असीमित सेवा बहुत प्रतिक्रियाशील है क्योंकि यह कई क्लाइंट कॉलों को अंतःस्थापित कर सकती है और समानांतर (2) में निष्पादित कर सकती है। इसके बावजूद, सेवा एक थ्रेड (3) पर पूरी तरह से थ्रेड-सुरक्षित चला सकती है और एक सिंगलटन सेवा (1) या एक सत्र या केवल कॉल के लिए ढांचे द्वारा बनाई गई सेवा वस्तु हो सकती है।
जब सेवा को लागू करने, ServiceBehaviourAttributes कृपया ध्यान दें (1) ... (3):
[ServiceContract(Namespace="X", Name="TheContract")]
public interface IAsyncContractForClientAndService
{
[OperationContract]
Task<TResponse> SendReceiveAsync(TRequest req);
}
[ServiceBehavior (InstanceContextMode = InstanceContextMode.Single, // (1)
// also works with InstanceContextMode.PerSession or PerCall
ConcurrencyMode = ConcurrencyMode.Multiple, // (2)
UseSynchronizationContext = true)] // (3)
public MyService : IAsyncContractForClientAndService
{
public async Task<TResponse> SendReceiveAsync(TRequest req)
{
DoSomethingSynchronous();
await SomethingAsynchronous();
// await lets other clients call the service here or at any await in
// subfunctions. Calls from clients execute 'interleaved'.
return new TResponse(...);
}
}
हर कॉल एक धागा, एक System.Threading.SynchronizationContext.Current पर चलाने के लिए = अशक्त चाहिए! उस समय उपस्थित रहें जब आप ओपन() सर्विसहोस्ट खोलें। सिंक्रनाइज़ेशन कॉन्टेक्स्ट का उपयोग करके, आपको ताले के बारे में परवाह करने की आवश्यकता नहीं है। परमाणु, गैर-व्यवधान करने योग्य कोड खंड लगभग एक से अगले तक प्रतीक्षा करते हैं। ध्यान रखें कि साझा सेवा डेटा प्रत्येक प्रतीक्षा में एक सतत स्थिति में है और इस बात से अवगत रहें कि एक ग्राहक से लगातार अनुरोधों को जवाब देने के क्रम में जवाब नहीं दिया जा सकता है।
ग्राहक पक्ष पर, अतुल्यकालिक सेवा आपरेशन awaitable है:
var response = await client.Channel.SendReceiveAsync(request);
यह आपरेशन अनुबंध में बाहर या रेफरी पैरामीटर का उपयोग करने के लिए संभव नहीं है। सभी प्रतिक्रिया डेटा लौटाए गए मूल्य कार्य (टी) द्वारा पारित किया जाना चाहिए।
मैं AsyncWcfLib में इस इंटरफ़ेस का उपयोग करता हूं, यह Actor based programming model का समर्थन करता है।
स्रोत
2012-04-04 22:17:49
कोर। मुझे कुछ चमकदार और नए पेश करने के लिए बस +1। – spender