2012-04-16 22 views
6

MSDN के अनुसार अलग भंडारण में फ़ाइलों के माध्यम से अग्रभूमि ऐप और पृष्ठभूमि एजेंटों के बीच संचार एक म्यूटेक्स द्वारा संरक्षित किया जाना चाहिए।ऐप और पृष्ठभूमि एजेंट के बीच साझा आईसोस्टोरेज डेटा की सुरक्षा

एकमात्र लेख जो मैं पा सकता हूं, यह वर्णन करता है कि यह कैसे करें this one डीना बेरी द्वारा किया जाए। हालांकि, वह केवल म्यूटेक्स के साथ पढ़ने की रक्षा करता है, न कि लेखन।

ऐसा करने का सही तरीका क्या है?

उत्तर

6

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

एक मॉनीटर केवल एक प्रक्रिया के भीतर लॉक कर सकता है।

Mutex उदाहरण:

फ़ोन अनुप्रयोग कार्य:

public class DatabaseService 
{ 
    private Mutex _mut=new Mutex("mutex control",false); 
    public void AddToDatabase(DbObject row) 
    { 
    mut.WaitOne(); 
    SaveRow(row); 
    mut.ReleaseMutex(); 
    } 
} 

अनुसूचित टास्क वर्ग:

public class ResourceUtilisation 
{ 
    private Mutex _mut=new Mutex("mutex control",true); 
    //.. does stuff 
    private static void UseResource() 
    { 
    // Wait until it is safe to enter. 
    _mut.WaitOne(); 

    //Go get dataabse and add some rows 
    DoStuff(); 

    // Release the Mutex. 
    _mut.ReleaseMutex(); 
    } 
} 

ऊपर के उदाहरण हम केवल करने के लिए एक समय का उपयोग पर एक अनुप्रयोग अनुमति दे रहे हैं में स्थानीय डेटाबेस संसाधन। यही कारण है कि हम एक म्यूटेक्स का उपयोग करेंगे।

मॉनिटर उदाहरण (लॉक सिंटैक्स का उपयोग):

फ़ोन अनुप्रयोग कार्य:

public class DatabaseService 
{ 
    private object _locker=new object(); 
    public void AddToDatabase(DbObject row) 
    { 
    lock(_locker) 
     SaveRow(row); 
    } 
} 

अनुसूचित टास्क वर्ग:

public class ResourceUtilisation 
{ 
    private object _locker=new object(); 
    //.. does stuff 
    private static void UseResource() 
    { 

    //Go get dataabse and add some rows 
    lock(_locker) 
     DoStuff(); 
    } 
} 

इस उदाहरण में हम एक से अधिक आवेदन धागा प्रवेश बंद कर सकते हैं SaveRow और हम DoStuff विधि में प्रवेश करने से एक से अधिक अनुसूचित टास्क थ्रेड को रोक सकते हैं। हम मॉनीटर के साथ क्या नहीं कर सकते हैं यह सुनिश्चित करता है कि केवल एक धागा स्थानीय डीबी को एक बार में एक्सेस कर रहा हो।

यह मूल रूप से अंतर है। मॉनिटर की तुलना में मॉनीटर बहुत तेज़ है।

+2

आप एक मामले में प्रारंभिक रूप से सही सत्य के साथ म्यूटेक्स क्यों बनाते हैं, न कि दूसरे? –

+1

@ जेस्परलेर्सन-लेडेट प्रारंभिकऑनड इंगित करता है कि कॉलिंग थ्रेड में म्यूटेक्स का प्रारंभिक स्वामित्व होना चाहिए या नहीं – onmyway133