मेरे सी #/एक्सएएमएल मेट्रो ऐप में, एक बटन है जो लंबे समय तक चलने वाली प्रक्रिया को बंद कर देता है। तो, के रूप में सिफारिश, मैं async उपयोग कर रहा हूँ/यकीन है कि यूआई धागा अवरुद्ध नहीं प्राप्त करता है बनाने के लिए इंतजार है:क्या किसी अन्य एसिंक विधि की बजाय किसी ईवेंट का इंतजार करना संभव है?
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;
मतदान स्पष्ट रूप से भयानक है (व्यस्त प्रतीक्षा/चक्र का अपशिष्ट) और मैं कुछ घटना-आधारित के लिए देख रहा हूँ।
कोई भी विचार?
बीटीडब्ल्यू इस सरलीकृत उदाहरण में, एक समाधान GetResults() को दो हिस्सों में विभाजित करने के लिए निश्चित होगा, स्टार्ट बटन से पहले भाग और जारी रखें बटन से दूसरे भाग को आमंत्रित करें। हकीकत में, GetResults में होने वाली चीजें निष्पादन के भीतर विभिन्न बिंदुओं पर अधिक जटिल और विभिन्न प्रकार के उपयोगकर्ता इनपुट की आवश्यकता हो सकती है। तो तर्क को कई तरीकों से तोड़ना गैर-तुच्छ होगा।
मैं एक 'ManualResetEvent' इस्तेमाल किया गया होगा। क्या 'सेमफोर स्लिम' का उपयोग करने का कोई फायदा है या आप किसी एक का उपयोग कर सकते हैं? –
@DanielHilgarth 'मैनुअल रीसेट (स्लिम)' 'WaitAsync()' का समर्थन नहीं करता है। – svick
@svick: अच्छा बिंदु। हालांकि, 'GetResult' पहले से ही' async 'है, आप बिना किसी समस्या के इस विधि के अंदर अवरुद्ध कर सकते हैं, है ना? –