मेरे C # / XAML मेट्रो ऐप में, एक बटन है जो एक लंबी चलने वाली प्रक्रिया को बंद कर देता है। इसलिए, जैसा कि सुझाया गया है, मैं यह सुनिश्चित करने के लिए async / प्रतीक्षा का उपयोग कर रहा हूं कि UI थ्रेड अवरुद्ध न हो।
private async void Button_Click_1(object sender, RoutedEventArgs e)
{
await GetResults();
}
private async Task GetResults()
{
// Do lot of complex stuff that takes a long time
// (e.g. contact some web services)
...
}
कभी-कभी, GetResults के भीतर होने वाली सामग्री को जारी रखने से पहले अतिरिक्त उपयोगकर्ता इनपुट की आवश्यकता होगी। सादगी के लिए, मान लें कि उपयोगकर्ता को केवल "जारी रखें" बटन पर क्लिक करना है।
मेरा प्रश्न है: मैं GetResults के निष्पादन को इस तरह कैसे निलंबित कर सकता हूं कि यह किसी अन्य बटन के क्लिक जैसी घटना की प्रतीक्षा करता है ?
यहाँ एक बदसूरत तरीका है जिसे मैं देख रहा हूँ: "जारी रखें" बटन के लिए ईवेंट हैंडलर एक ध्वज सेट करता है ...
private bool _continue = false;
private void buttonContinue_Click(object sender, RoutedEventArgs e)
{
_continue = true;
}
... और GetResults समय-समय पर यह चुनाव:
buttonContinue.Visibility = Visibility.Visible;
while (!_continue) await Task.Delay(100); // poll _continue every 100ms
buttonContinue.Visibility = Visibility.Collapsed;
मतदान स्पष्ट रूप से भयानक है (चक्रों की व्यस्त प्रतीक्षा / बर्बादी) और मैं कुछ घटना-आधारित खोज रहा हूँ।
कोई विचार?
इस सरलीकृत उदाहरण में Btw, एक समाधान निश्चित रूप से GetResults () को दो भागों में विभाजित करने के लिए होगा, प्रारंभ बटन से पहला भाग और जारी रखें बटन से दूसरा भाग। वास्तव में, GetResults में होने वाली सामग्री अधिक जटिल है और निष्पादन के भीतर विभिन्न बिंदुओं पर विभिन्न प्रकार के उपयोगकर्ता इनपुट की आवश्यकता हो सकती है। इसलिए कई तरीकों में तर्क को तोड़ना गैर-तुच्छ होगा।
ManualResetEvent(Slim)
का समर्थन नहीं लगताWaitAsync()
।