2011-06-16 11 views
8

माइक्रोसॉफ्ट के ईडब्लूएस का उपयोग करते हुए लाइफटाइम तत्व में वृद्धि, हम एक मेलबॉक्स सुन सकते हैं और जब कोई नया ईमेल आता है तो कार्रवाई कर सकते हैं। हालांकि, मैं यह नहीं समझ सकता कि कनेक्शन समय से कैसे बचें ।ईडब्ल्यूएस स्ट्रीमिंग सदस्यता कनेक्शन

service = new ExchangeService(ExchangeVersion.Exchange2010_SP1); 
StreamingSubscriptionConnection conn = new StreamingSubscriptionConnection(service, 30); 

दूसरे शब्दों में, मुझे मिल गया है:

प्रति माइक्रोसॉफ्ट, यहाँ एक StreamingSubscriptionConnection के लिए निर्माता है:

public StreamingSubscriptionConnection (
    ExchangeService service, 
    int lifetime 
) 

मेरी ऐप्लिकेशन में, मैं इसे इस रूप में कोड जोड़ने के बाद टाइमआउट (आजीवन) 30 मिनट तक सेट है, क्योंकि यह उच्चतम है जिसे मैं इसे सेट करने में सक्षम हूं। मैं इसे कैसे बढ़ा सकता हूं? या, मैं जीवित रहने में इस सदस्यता को कैसे चालित कर सकता हूं, भले ही आने वाले ईमेल के बीच ~ 45 मिनट का ट्रांजैक्शन हो?

उत्तर

14

30 मिनट एक कठिन सीमा है। आप इसे उच्च मूल्य में नहीं बदल सकते हैं।

इस समस्या को हल करने के लिए, कनेक्शन उदाहरण के ऑनडिस्कनेक्ट ईवेंट के ऑनडिस्कनेक्टेड हैंडलर को हैंडलर को तार दें। वहां से सदस्यता को पुनरारंभ करें (उस हैंडलर से केवल कनेक्शन कनेक्शन खोलें)।

+0

लेकिन यह वैध डिस्कनेक्ट होने के बारे में क्या है? उदाहरण के लिए, कोई सेवा बंद कर देता है ... मुझे दो परिदृश्यों के बीच अंतर करने की आवश्यकता होगी। – WEFX

+0

आह, अब मैं देखता हूं। एक "स्टॉप" को डिस्कनेक्ट से अलग माना जाता है। मैं इसे ले जाऊँगा। धन्यवाद – WEFX

+0

मुझे यह थोड़ा परीक्षण करने दो, और बक्षीस तुम्हारा होगा, @ हेनिंग क्रूज़। – WEFX

1

यदि लोग रुचि रखते हैं, तो यहां जोड़ा गया तर्क थोड़ा सा है।

मैं अपने प्रारंभ विधि को यह कहा:

conn.OnDisconnect += 
    new StreamingSubscriptionConnection.SubscriptionErrorDelegate(OnDisconnect); 

मैं तो OnDisconnect विधि कहा:

private void OnDisconnect(object sender, SubscriptionErrorEventArgs args) 
{ 
    Start(); 
} 

अंत में, यह अभी भी बेहतर की जरूरत है, क्योंकि यह केवल बार-आउट और हर आधे पुन: कनेक्ट हो - इनकमिंग ईमेल गतिविधि के बावजूद, आपका। मैं उस जगह पर कुछ प्राप्त करूंगा जो हर बार एक नया संदेश आने पर काउंटर को रीसेट करता है। फिर, यह केवल 48 बार की बजाय प्रति दिन दो बार होगा! फिर भी, यह मेरा ईमेल-सुनवाई कार्यक्रम ऑनलाइन रखने के अपने उद्देश्य की सेवा कर रहा है।

+0

क्या आपके ऑनस्टार्ट विधि को स्ट्रिंग की आवश्यकता नहीं है [] पैरामीटर – JsonStatham

+1

के रूप में तर्क देता है आप अपनी स्टार्ट() विधि की सामग्री नहीं दिखा रहे हैं, लेकिन आप जो कर रहे हैं वह मुझे बुरी भावनाएं देता है। मुझे डर है कि आप हर दिन 48 स्ट्रीमिंगस्क्रिप्शन कनेक्शन ऑब्जेक्ट्स बना रहे हैं, और वे कचरा-संग्रह नहीं हो सकते हैं क्योंकि उनके पास एक ईवेंट हैंडलर विधि है। तो आप शायद एक स्मृति रिसाव है। चीजों की बड़ी योजना में, एक बहुत छोटा, लेकिन अभी भी ... – RenniePet

1

यदि कोई और दिलचस्पी लेता है, तो मैं इसे पूरा कर रहा हूं।

मैं कनेक्शन को खोलना चाहता हूं, इसलिए मैं इसे ऑनडिस्कनेक्ट हैंडलर में रीसेट कर रहा हूं।

हालांकि, इसे रीसेट करने से पहले, मैं प्रतिबिंब का उपयोग कर कनेक्शन ऑब्जेक्ट पर निजी "सदस्यता" शब्दकोश की जांच करता हूं।

इससे मुझे अपने कोड (ऑनोटोटिफिकेशन) में कहीं और मेरे कनेक्शन से सदस्यता समाप्त करने की अनुमति मिलती है, और जब सभी सब्सक्रिप्शन से सदस्यता समाप्त हो जाती है, तो मैं कनेक्शन बंद करने में सक्षम हूं।

void connection_OnDisconnect(object sender, SubscriptionErrorEventArgs args) 
    { 
     var c = (Dictionary<string, StreamingSubscription>)typeof(StreamingSubscriptionConnection).GetField("subscriptions",System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).GetValue(sender); 

     if (c.Count > 0) 
     { 
      // reopen the connection 
      ((StreamingSubscriptionConnection)sender).Open(); 

      using (var db = new Metrics_DatabaseEntities()) 
      { 
       PushNotificationTest pt = new PushNotificationTest(); 
       pt.RetObj = "Connection reset"; 

       db.PushNotificationTests.Add(pt); 

       db.SaveChanges(); 

      } 
     } 
     else 
     { 
      using (var db = new Metrics_DatabaseEntities()) 
      { 
       PushNotificationTest pt = new PushNotificationTest(); 
       pt.RetObj = "Connection closed!"; 

       db.PushNotificationTests.Add(pt); 

       db.SaveChanges(); 

      } 
     } 
    } 

कृपया गरीब तरीका है कि इस लिखा है उपेक्षा, इस, बस मेरा पहला संस्करण है के रूप में मैं इस अधिक सफाई से जल्द ही लिखने के लिए योजना बना रहे हैं:

यहाँ मेरी कोड है। मैंने सोचा कि मैं अपनी पद्धति को उन लोगों के साथ साझा करूंगा जो रुचि रखते हैं।

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