আমার সি # / এক্সএএমএল মেট্রো অ্যাপ্লিকেশনে, একটি বোতাম রয়েছে যা দীর্ঘ-চলমান প্রক্রিয়াটিকে সরিয়ে দেয়। সুতরাং, প্রস্তাবিত হিসাবে, আমি ইউআই থ্রেডটি ব্লক না হয়ে গেছে তা নিশ্চিত করতে আমি 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;
পোলিংটি স্পষ্টতই ভয়ানক (চক্রের অপেক্ষায় / অপচয়ে ব্যস্ত) এবং আমি ইভেন্ট-ভিত্তিক কিছু খুঁজছি।
কোন ধারনা?
এই সরল উদাহরণে বিটিডব্লিউ, একটি সমাধান অবশ্যই গেটআরসাল্টস () কে দুটি ভাগে বিভক্ত করা, প্রথম অংশটি স্টার্ট বোতাম থেকে এবং দ্বিতীয় অংশটি চালিয়ে যাওয়া বোতাম থেকে প্রার্থনা করবে। বাস্তবে, গেটআরলস্টগুলিতে ঘটে যাওয়া স্টাফগুলি আরও জটিল এবং বিভিন্ন ধরণের ব্যবহারকারীর ইনপুট কার্যকর করতে পারে different সুতরাং একাধিক পদ্ধতিতে যুক্তি ভাঙ্গা অ-তুচ্ছ হবে-
ManualResetEvent(Slim)
সমর্থন করে বলে মনে হচ্ছে নাWaitAsync()
।