8

मैं WinRT में एक कीबोर्ड ईवेंट से बुलाया गया एक विधि (सबमिट में) (उदाहरण में) में प्रसंस्करण में देरी करने में देरी करने की कोशिश कर रहा हूं) जब तक कोई और घटना नहीं होती है समय अवधि (इस मामले में 500ms)।कार्य को कॉल करते समय टास्क कैंसेल अपवाद। कुंजीपटल ईवेंट में रद्दीकरण टोकन के साथ डेले

मुझे केवल सबमिट करने के लिए सबमिट करें() को चलाने के लिए जब मुझे लगता है कि उपयोगकर्ता टाइपिंग समाप्त कर चुका है।

नीचे दिए गए कोड का उपयोग करके, मैं एक सिस्टम प्राप्त कर रहा हूं। Treading.Tasks.TaskCanceledException जब कार्य। डेले (500, रद्दीकरण टोकन। टोकन); कहा जाता है। मैं यहाँ क्या गलत कर रहा हूँ?

CancellationTokenSource cancellationToken = new CancellationTokenSource(); 

private async void SearchBox_QueryChanged(SearchBox sender, SearchBoxQueryChangedEventArgs args) 
{ 

     cancellationToken.Cancel(); 
     cancellationToken = new CancellationTokenSource(); 

    await Task.Delay(500, cancellationToken.Token); 

    if (!cancellationToken.IsCancellationRequested) 
    { 
     await ViewModel.SubmitQuery(); 
    } 
} 

उत्तर

11

इसकी अपेक्षा की जा सकती है। जब आप पुराने Delay को रद्द करते हैं, तो यह अपवाद उठाएगा; इस तरह रद्दीकरण काम करता है। अपेक्षित अपवाद को पकड़ने के लिए आप Delay के आस-पास एक सरल try/catch डाल सकते हैं।

ध्यान दें कि यदि आप इस तरह के समय-आधारित तर्क करना चाहते हैं, तो आरएक्स async से अधिक प्राकृतिक फिट है।

+0

आप कैसे आरएक्स समय आधारित तर्क – Anupam

+2

@Anupam के लिए बेहतर विकल्प है पर कुछ संसाधनों के लिए लिंक उपलब्ध कराएं: यह मेरे अपने अनुभव से है। –

25

यदि आप खाली कार्रवाई के साथ ContinueWith() जोड़ते हैं, तो अपवाद नहीं फेंक दिया जाता है।

await Task.Delay(500, cancellationToken.Token).ContinueWith(tsk => { }); 
+4

यह बहुत बढ़िया है, धन्यवाद। कुछ वास्तव में बदसूरत कोशिश/पकड़ कोड बचाता है :) –

+1

इसके लिए धन्यवाद! डीबगर में बहुत परेशान होने के बावजूद यह पकड़ा गया है। मुझे लगता है कि इन 'डेले' स्थितियों में हम ** ** टोकन को रद्द करने की उम्मीद करते हैं, इसलिए अपवाद को भी उठाया/पकड़ा नहीं जाना चाहिए, और यह पूरी तरह से तय किया गया है। –

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