2013-06-12 13 views
5

जारी करना मेरे पास एक वेब एप्लिकेशन है जिसे डेटा स्टोर करने के लिए एप्लिकेशन कैश का उपयोग करने की आवश्यकता है (अनुरोध के आधार पर उस डेटा ओना अनुरोध प्राप्त करने के उच्च ओवरहेड के कारण)। यह दृष्टिकोण अच्छी तरह से काम करने लगता है https://stackoverflow.com/a/16961962/236860एक म्यूटेक्स

पर पिछले पोस्ट देखें, लेकिन मैं वेब साइट की त्रुटि में निम्नलिखित सामयिक त्रुटियों देख रहा हूँ:

public string GetData(HttpContext context) 
{ 
    var cache  = context.Cache; 
    Mutex mutex = null; 
    string data = (string)cache[CacheKey]; 

    // Start check to see if available on cache 
    if (data == null) 
    { 
     try 
     { 
      // Lock base on resource key 
      // (note that not all chars are valid for name) 
      mutex = new Mutex(true, CacheKey); 

      // Wait until it is safe to enter (someone else might already be 
      // doing this), but also add 30 seconds max. 
      mutex.WaitOne(30000); 

      // Now let's see if some one else has added it... 
      data = (string)cache[CacheKey]; 

      // They did, so send it... 
      if (data != null) 
      { 
       return data; 
      } 


      // Still not there, so now is the time to look for it! 
      data = GetSlowFeed(context); 

      cache.Remove(CacheKey); 
      cache.Add(CacheKey, data, null, GetExpiryDate(), 
       TimeSpan.Zero, CacheItemPriority.Normal, null); 
     } 
     finally 
     { 
      // Release the Mutex. 
      if (mutex != null) 
      { 
       mutex.ReleaseMutex(); 
      } 
     } 
    } 

    return data; 
} 
:

System.ApplicationException: Object synchronization method was called from an 
unsynchronized block of code. 
at System.Threading.Mutex.ReleaseMutex() 
at InboxInsight.Web.Web_Controls.Twitter.TwitterFeed.GetTwitterData(HttpContext context) 
at InboxInsight.Web.Web_Controls.Twitter.TwitterFeed.ProcessRequest(HttpContext context) 
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) 

संदर्भ के लिए, कोड ब्लॉक है

जो मैंने शोध किया है, उससे पता चलता है कि यह समस्या एक प्रक्रिया थ्रेड के कारण होती है जो म्यूटेक्स को रिलीज़ करने की कोशिश कर रही है, लेकिन यह नहीं समझता कि यह कैसे हो सकता है।

क्या कोई सुझाव दे सकता है कि मैं इस समस्या से बचने के लिए कोड को फिर से कैसे बना सकता हूं?

+0

मैंने आपके अन्य प्रश्न पर एक टिप्पणी जोड़ा। हालांकि यह शायद यहां भी उपयुक्त है। एएसपीनेट के लिए मौजूदा कैशिंग प्रदाता हैं। AppFabric एक है, Memcached एक और है। दोनों जो करते हैं उस पर बहुत अच्छे होते हैं। इस बिंदु पर कि मैं अपना खुद का रोलिंग परेशान नहीं करूंगा। – NotMe

+0

हाय क्रिस, सुझाव के लिए धन्यवाद। मैंने अब ऐपफ़ैब्रिक और मेमकैच किया है, लेकिन वे मेरे एप्लिकेशन के लिए उपयुक्त नहीं लग रहे हैं क्योंकि यह एक साझा होस्टिंग वातावरण में चल रहा है। वितरित कैश अनुप्रयोगों के रूप में मेरा मानना ​​है कि इन दोनों को सर्वर/ओएस स्तर पर स्थापित करने की आवश्यकता है, दुर्भाग्यवश, इस एप्लिकेशन में उनके उपयोग को रोकता है। – Neilski

उत्तर

13

आप इस मामले को संभालने नहीं कर रहे हैं जिससे mutex.WaitOne झूठी यानी समय निकाल देता है। अगर प्रतीक्षा करें झूठी वापसी करता है तो आपके पास म्यूटेक्स नहीं है इसलिए आपको इसे जारी करने की आवश्यकता नहीं है।

bool iOwnTheMutex; 

try { 
    // set up mutex here... 
    iOwnTheMutex = mutex.WaitOne(2000); 
    if (iOwnTheMutex) { 
     // do what you need to do 
    } 
} 
finally { 
    if (mutex != null && iOwnTheMutex) { 
     mutex.ReleaseMutex(); 
    } 
}  
+0

धन्यवाद जैक, इसने समस्या का समाधान किया है। – Neilski

+0

यह उत्तर अब मेट्रो ऐप्स में काम नहीं करता है। अपवाद अभी भी लगातार होता है, परीक्षण मामले में भी, यदि iOwnTheMutex सत्य है। मैं एक थ्रेड (यूआई) को म्यूटेक्स को ले/रिलीज़ करने के साथ फिर से बनाने में सक्षम हूं, जबकि एक अलग थ्रेड (गैर-यूआई) म्यूटेक्स लेता है और इसे छोड़ने में असमर्थ है, बिना किसी अन्य थ्रेड इसे लेने का प्रयास कर रहा है। –

+0

म्यूटेक्स का मुख्य विक्रय बिंदु प्रक्रियाओं के बीच सिंक्रनाइज़ कर रहा है। लगता है जैसे आप एक प्रक्रिया के भीतर सिंक्रनाइज़ कर रहे हैं। मुझे यकीन है कि आप सी # में सबसे आसान, 'लॉक' कीवर्ड की तरह कुछ और अधिक उपयुक्त पा सकते हैं। –

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