2010-11-04 18 views
15

अगर मैं डब्लूसीएफ सेवा विधि कहता हूं तो मैं ऐसा कुछ करूंगा:Async सीटीपी - मैं एक wcf सेवा कॉल करने के लिए async/प्रतीक्षा का उपयोग कैसे कर सकते हैं?

proxy.DoSomethingAsync(); 
proxy.DoSomethingAsyncCompleted += OnDoSomethingAsyncCompleted; 

मैं नए async ctp का उपयोग करके ऐसा कैसे कर सकता हूं? मुझे लगता है मुझे proxy.DoSomethingTaskAsync या proxy.DoSomethingAsync().ToTask() जैसे कुछ चाहिए? Xzx14 कीवर्ड का उपयोग करने में सक्षम होने के लिए वेब सेवा कॉल को Task<T> वापस करने की आवश्यकता है, लेकिन कैसे ??

+0

कोर। मुझे कुछ चमकदार और नए पेश करने के लिए बस +1। – spender

उत्तर

10

CTP में कारखाना तरीकों कि जो कि नई async कीवर्ड के साथ संगत कर रहे हैं में नियमित रूप से एपीएम कार्य (शुरू/अंत) मोड़ का काम करते हैं, उदाहरण के लिए कर रहे हैं आप बराबर कर सकते हैं और फिर आप तो जैसे इसे कहते हैं:

async proxy.DoSomethingTaskAsync() 

अधिक जानकारी के लिए CTP चर्चा समूह पर this thread देखें

+0

उत्तर देने के लिए धन्यवाद, लेकिन मुझे अभी भी यह समझ में नहीं आता है। मैं समझता हूं कि यह आपके उदाहरण में दिखाए गए स्ट्रीम के लिए कैसे काम करता है, लेकिन मैं इसे एक डब्ल्यूसीएफ सेवा कॉल पर कैसे लागू करूं? – Roger

+0

जेनरेट की गई प्रॉक्सी में BeginDo Something/EndDo कुछ विधियां होंगी (बशर्ते आप svcutil/wizards के लिए सही विकल्प पास करें)। – Brian

4

फिर Async सीटीपी में एक डब्ल्यूसीएफ नमूना है जो आपको दिखाएगा कि डब्ल्यूसीएफ में एसिंक/प्रतीक्षा मॉडल का उपयोग कैसे करें।

WCF में इस मॉडल का समर्थन के लिए योजनाओं के संदर्भ में, आप पोस्ट निम्नलिखित पर एक नज़र ले जा सकते हैं:

http://blogs.msdn.com/b/endpoint/archive/2010/11/13/simplified-asynchronous-programming-model-in-wcf-with-async-await.aspx

आशा इस मदद करता है।

एमाडियो

+2

बहुत खराब ये सुविधाएं अभी तक उपलब्ध नहीं हैं। – Firoso

2

मैट से उल्लेख किया है, वहाँ एक TaskFactory.FromAsync विधि है कि आप एक Begin/End जोड़ी से एक Task बनाने की अनुमति देता है। जब आप अपना डब्लूसीएफ संदर्भ जोड़ते हैं तो आपको एसिंक्रोनस एंडपॉइंट्स को सक्षम करने की आवश्यकता होती है, और फिर आप उन्हें विस्तार विधियों का उपयोग करके स्वयं को लपेट सकते हैं।

जैसा कि अमेदेओ द्वारा वर्णित है, (C# WCF) Stock Quotes निर्देशिका के तहत असिन सीटीपी में इसका एक नमूना है।

इसके अलावा, उस निर्देशिका में, TaskWsdlImportExtension प्रोजेक्ट है। इस तरह के रूप में अपने .config कि dll के लिए एक संदर्भ जोड़ें और संशोधित:

<configuration> 
<system.serviceModel> 
    <client> 
    <metadata> 
    <wsdlImporters> 
    <extension type="TaskWsdlImportExtension.TaskAsyncWsdlImportExtension, TaskWsdlImportExtension" /> 
    </wsdlImporters> 
    </metadata> 
    </client> 
</system.serviceModel> 
</configuration> 

तो फिर तुम सब पर अपनी खुद की रैपिंग करने के लिए नहीं है; TaskWsdlImportExtension यह आपके लिए करेगा।

2

एसिंक्रोनस क्लाइंट एक सिंक्रोनस सेवा को कॉल करना काफी आम है।
ग्राहक और सेवा अनुबंध मैच (पर्दे के पीछे का इस्तेमाल किया एक सा जादू) के बाद:

[ServiceContract(Namespace="X", Name="TheContract")] 
    public interface IClientContractAsynchronous 
    { 
     [OperationContract] 
     Task<TResponse> SendReceiveAsync(TRequest req); 
    } 

    [ServiceContract(Namespace="X", Name="TheContract")] 
    public interface IServiceContractSynchronous 
    { 
     [OperationContract] 
     TResponse SendReceive(TRequest req); 
    } 

ग्राहक इंटरफ़ेस सीधे awaitable है:

var response = await client.Channel.SendReceiveAsync(request); 

यह पताउपयोग करने के लिए संभव नहीं है या ऑपरेटिंग अनुबंध में रेफ पैरामीटर। सभी प्रतिक्रिया डेटा वापसी मूल्य में पारित किया जाना चाहिए। यह वास्तव में मेरे लिए एक तोड़ने वाला बदलाव था।
मैं AsyncWcfLib में इस इंटरफ़ेस का उपयोग करता हूं, यह Actor based programming model का समर्थन करता है।

+0

क्या आप अपने उत्तरों को 1 में मर्ज करना चाहिए? –

6

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 का समर्थन करता है।

1

आप सही ढंग से इंगित करते हैं कि कार्य और कार्य लौटने के तरीकों के आस-पास के रूप में एसिंक/प्रतीक्षा (एसिंक/प्रतीक्षा के काम के बारे में एक महान स्पष्टीकरण के लिए, here देखें)। यहाँ कैसे एक WCF सेवा के लिए टास्क आधारित विधियों उत्पन्न करने के लिए है:

  1. Visual Studio 2012 आर सी "कॉन्फ़िगर सेवा संदर्भ" संवाद बॉक्स में एक अतिरिक्त चेक-बॉक्स है: "कार्य आधारित संचालन उत्पन्न करें"। जबकि मुझे MSDN में प्रलेखित विकल्प नहीं दिखाई देता है, मुझे उम्मीद है कि यह विशेष रूप से निर्बाध एसिंक/डब्ल्यूसीएफ कॉल पर प्रतीक्षा करने की अनुमति देने के लिए मौजूद है।

  2. पिछले संस्करणों के लिए, this post पर एक नज़र डालें, जो एक विस्तार का वर्णन करता है जो सीटीपी के साथ भी डब्ल्यूसीएफ पर कार्य <> आधारित विधियों को उत्पन्न करने की अनुमति देता है।

संबंधित मुद्दे