2012-08-03 12 views
9

के अंदर async प्रतीक्षा का उपयोग करना मेरे पास हस्ताक्षर के साथ विधि है जिसे मैं नहीं बदल सकता। यहशून्य विधि

protected override void OnInitialize() 

Windows 8 मेट्रो API का उपयोग कर रहा है, तो फ़ाइल मौजूद है की जाँच करें और इसे पढ़ा, इस NoSignatureChange विधि के अंदर की जरूरत होनी चाहिए। PlainOldCSharp का उपयोग करना, मैं

protected override void OnInitialize() 
{ 
    ... 
    try 
    { 
    var file = folder.OpenFile(fileName); 
    fileExists=true; 
    } 
    catch(FileNotFoundException) 
    { 
    fileExists=false 
    } 
} 

याद रखें की तरह कुछ, इसके अलावा लिखते थे Windows 8 API only way to check if file exists is handling FileNotFoundException में, में Windows 8 एपीआई सभी FileIO एपीआई async है, इसलिए मैं केवल file.OpenFileAsync विधि है।

तो, सवाल यह है: मैं कैसे विधि

+0

ओह, और AsTask()। प्रतीक्षा करें() 3 अलग-अलग अपवाद स्वयं फेंक सकते हैं –

+0

आप विधि के हस्ताक्षर को वास्तव में क्यों नहीं बदल सकते? – svick

+0

@svick मैंने प्रश्न अपडेट किया है। –

उत्तर

18

युक्त के हस्ताक्षर बदले बिना 8 एपीआई इस कोड को Windows में folder.OpenFileAsync विधि का उपयोग कर लिखना चाहिए आप अभी भी एक void विधि async बना सकते हैं:

protected async void CannotChangeSignature() 
{ 
    ... 
} 

एक async विधि के लिए मान्य वापसी प्रकार हैं:

  • void
  • Task
  • Task<T>

हालांकि, आप इसे वास्तव में ब्लॉक करना चाहते हैं, तो आप मूल रूप से मंच के खिलाफ लड़ रहे हैं - पूरे मुद्दे है करने से बचने के अवरुद्ध।

आप कहते हैं कि आप हस्ताक्षर नहीं बदल सकते हैं - लेकिन यदि आप इस अवरोधन पर भरोसा कर रहे हैं तो आपके पास है जो आप कोडिंग के रास्ते को बदलने के लिए बदलते हैं।

आदर्श रूप में आप Task<bool> को हस्ताक्षर बदलना चाहिए:

protected async Task<bool> CannotChangeSignature() 
{ 
    ... 
    try 
    { 
    await ApplicationData.Current.LocalFolder.GetFileAsync(fileName); 
    return true; 
    } 
    catch(FileNotFoundException) 
    { 
    return false; 
    } 
} 

संपादित करें: यदि आप वास्तव में एक अवरुद्ध एक की जरूरत है, तो आप सिर्फ AsTask().Wait() कॉल करने के लिए होगा, AggregateException पकड़ने और जाँच करें कि क्या यह एक में शामिल है FileNotFoundException। यह वास्तव में बहुत भयानक है हालांकि ... क्या आप इस बारे में डिज़ाइन नहीं कर सकते हैं ताकि को अवरुद्ध करने की आवश्यकता न हो? उदाहरण के लिए, फ़ाइल की जांच करना प्रारंभ करें, और एक त्रुटि (या जो कुछ भी) दिखाएं यदि आपको लगता है कि यह अस्तित्व में नहीं है।

+1

कहा जा रहा है कि, इसके अलावा मैं एक विधि नाम में 'नहीं कर सकता' का उपयोग नहीं करता। मुझे यकीन नहीं है कि यह सम्मेलन के खिलाफ है या नहीं, लेकिन यह समझ में आता है कि पहली नज़र में क्या हो रहा है यह समझना थोड़ा मुश्किल है। लेकिन यह मेरी विनम्र राय है मुझे लगता है ;-) –

+0

जॉन, उत्तर देने के लिए धन्यवाद। हां मुझे इसे अवरुद्ध करने की आवश्यकता है, और कारण मैं अपने ऐप में अन्य घटकों का उपयोग कर रहा हूं और वे इंटरफेस को परिभाषित करते हैं। –

+0

Async शून्य खतरनाक है क्योंकि यह अवरुद्ध नहीं है, और आप इसे अवरुद्ध नहीं कर सकते, जैसा कि मुझे पता है। –

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