সি # 5 অ্যাসিঙ্ক পুনরায় প্রবেশের সমাধান


16

সুতরাং, সি # 5 এ নতুন অ্যাসিঙ্ক সমর্থন সম্পর্কে কিছু আমাকে বগল করছে:

ব্যবহারকারী একটি বোতাম টিপে যা একটি অ্যাসিঙ্ক অপারেশন শুরু করে। কলটি তত্ক্ষণাত্ ফিরে আসে এবং বার্তা পাম্প আবার চলতে শুরু করে - এটিই পুরো বিষয়টি।

সুতরাং ব্যবহারকারী আবার বোতাম টিপতে পারে - পুনরায় প্রবেশের কারণ। যদি এই সমস্যা হয়?

আমি দেখেছি এমন ডেমোতে, তারা awaitকল করার আগে বোতামটি অক্ষম করে এবং পরে আবার এটি সক্ষম করে। এটি আমার কাছে বাস্তব-বিশ্বের অ্যাপ্লিকেশনে খুব ভঙ্গুর সমাধানের মতো মনে হয়।

আমাদের কি কোনও ধরণের স্টেট মেশিনের কোড করা উচিত যা নির্দিষ্ট করে চলমান ক্রিয়াকলাপগুলির জন্য কোন নিয়ন্ত্রণগুলি অক্ষম করা উচিত তা নির্দিষ্ট করে? নাকি এর চেয়ে ভাল উপায় আছে?

অপারেশনের সময়কালের জন্য আমি কেবলমাত্র একটি মডেল ডায়ালগ দেখানোর জন্য প্রলুব্ধ হয়েছি, তবে এটি কিছুটা স্লেজহ্যামার ব্যবহার করার মতো মনে হয়।

দয়া করে কোনও উজ্জ্বল ধারণা পেয়েছেন?


সম্পাদনা করুন:

আমি মনে করি যে অপারেশন চলাকালীন ব্যবহার করা উচিত নয় এমন নিয়ন্ত্রণগুলি অক্ষম করা কারণ আমি মনে করি যখন আপনার উইন্ডোতে অনেকগুলি কন্ট্রোল রয়েছে তখন এটি দ্রুত জটিল হয়ে উঠবে। আমি জিনিসগুলি সহজ রাখতে পছন্দ করি কারণ এটি প্রাথমিক কোডিং এবং পরবর্তী রক্ষণাবেক্ষণের সময় উভয় বাগের সম্ভাবনা হ্রাস করে।

যদি নিয়ন্ত্রণের কোনও সংগ্রহ থাকে যা একটি নির্দিষ্ট ক্রিয়াকলাপের জন্য অক্ষম করা উচিত? এবং যদি একাধিক অপারেশন একই সাথে চলমান হয়?


এটি সম্পর্কে ভঙ্গুর কি? এটি ব্যবহারকারীর দ্বারা কিছু প্রক্রিয়াজাত হওয়ার ইঙ্গিত দেয়। কিছু গতিশীল ইঙ্গিত কাজ যুক্ত করুন প্রক্রিয়াজাত করা হচ্ছে এবং এটি আমার কাছে পুরোপুরি ভাল ইউআই বলে মনে হচ্ছে।
স্টিভেন জিউরিস

PS: .NET 4.5 এর সি # কে সি # 5 বলা হয়?
স্টিভেন জিউরিস

1
শুধু কৌতূহল কেন এই প্রশ্নটি এখানে এবং এসও নয় কেন? এটি অবশ্যই কোড সম্পর্কে তাই আমি মনে করি এটি এখানে অন্তর্ভুক্ত থাকবে ...
সি রস

@ সি। রোস, এটি একটি নকশা / ইউআই প্রশ্ন বেশি। এখানে কোনও প্রযুক্তিগত পয়েন্ট নেই যা এখানে ব্যাখ্যা করা দরকার।
মরগান হের্লোকার

অ্যাজাক্স এইচটিএমএল ফর্মগুলিতে আমাদের একই রকম সমস্যা রয়েছে যেখানে কোনও ব্যবহারকারী সাবমিট বোতামটি হিট করে, একটি এজাক্স অনুরোধ প্রেরণ করা হয় এবং আমরা ব্যবহারকারীকে আবার জমা দিতে বাধা দিতে চাই, বোতামটি অক্ষম করা সেই পরিস্থিতিতে একটি খুব সাধারণ সমাধান
রায়নস

উত্তর:


14

সুতরাং, সি # 5 এ নতুন অ্যাসিঙ্ক সমর্থন সম্পর্কে আমাকে কিছুটা বগল করছে: ব্যবহারকারী একটি বোতাম টিপায় যা একটি অ্যাসিঙ্ক অপারেশন শুরু করে। কলটি তত্ক্ষণাত্ ফিরে আসে এবং বার্তা পাম্প আবার চলতে শুরু করে - এটিই পুরো বিষয়টি। সুতরাং ব্যবহারকারী আবার বোতাম টিপতে পারে - পুনরায় প্রবেশের কারণ। যদি এই সমস্যা হয়?

আসুন লক্ষ করে শুরু করুন যে এটি ইতিমধ্যে একটি সমস্যা, এমনকি ভাষায় অ্যাসিঙ্ক সমর্থন ছাড়াই। আপনি কোনও ইভেন্ট পরিচালনা করার সময় প্রচুর জিনিস বার্তাগুলিকে শনাক্ত করার কারণ হতে পারে। এই পরিস্থিতির জন্য আপনাকে ইতিমধ্যে রক্ষণাত্মক কোড করতে হবে; নতুন ভাষার বৈশিষ্ট্যটি এটিকে আরও স্পষ্ট করে তোলে , যা মঙ্গলতা।

কোনও ইভেন্টের সময় অযাচিত পুনরায় প্রবেশের কারণে চলমান বার্তার লুপের সর্বাধিক সাধারণ উত্স DoEvents। সম্পর্কে চমৎকার জিনিস awaitযেমন উল্টোদিকে DoEventsযে awaitকরে তোলে নতুন কার্যগুলি "ক্ষুধায় মারা" থেকে বর্তমানে সক্রিয় ক্রিয়াগুলি যাচ্ছে না এটা হওয়ার সম্ভাবনা। DoEventsবার্তাটির লুপটি পাম্প করে এবং তারপরে সিঙ্ক্রোনিকভাবে পুনরায় প্রবেশকারী ইভেন্ট হ্যান্ডলারটিকে আহ্বান জানায়, যেখানে awaitসাধারণত নতুন টাস্কটি সজ্জিত করে যাতে এটি ভবিষ্যতে কোনও পর্যায়ে চলে।

আমি দেখেছি এমন ডেমোগুলিতে, তারা অপেক্ষা করার আগে বোতামটি অক্ষম করে এবং পরে আবার সক্ষম করে। আমি মনে করি যে অপারেশন চলাকালীন ব্যবহার করা উচিত নয় এমন নিয়ন্ত্রণগুলি অক্ষম করা কারণ আমি মনে করি যখন আপনার উইন্ডোতে অনেকগুলি কন্ট্রোল রয়েছে তখন এটি দ্রুত জটিল হয়ে উঠবে। যদি নিয়ন্ত্রণের কোনও সংগ্রহ থাকে যা একটি নির্দিষ্ট ক্রিয়াকলাপের জন্য অক্ষম করা উচিত? এবং যদি একাধিক অপারেশন একযোগে চলছে?

আপনি ওও ভাষায় অন্য যে কোনও জটিলতা পরিচালনা করতে চান ঠিক সেইভাবেই আপনি সেই জটিলতা পরিচালনা করতে পারেন: আপনি একটি শ্রেণিতে বিভক্ত মেকানিজমগুলি , এবং নীতিটি সঠিকভাবে প্রয়োগের জন্য শ্রেণিকে দায়বদ্ধ করে তোলেন । (প্রক্রিয়াগুলি নীতি থেকে যৌক্তিকভাবে পৃথক রাখার চেষ্টা করুন; প্রক্রিয়াগুলির সাথে অত্যধিক ঝাঁকুনি না দিয়ে নীতি পরিবর্তন করা সম্ভব হবে))

যদি আপনার কাছে প্রচুর নিয়ন্ত্রণের সাথে একটি ফর্ম থাকে যা আকর্ষণীয় উপায়ে ইন্টারঅ্যাক্ট করে তবে আপনি নিজের তৈরির জটিলতার জগতে বাস করছেন । সেই জটিলতা পরিচালনা করতে আপনার কোড লিখতে হবে; আপনি যদি এটি পছন্দ না করেন তবে ফর্মটি সহজ করুন যাতে এটি এত জটিল না হয়।

অপারেশনের সময়কালের জন্য আমি কেবলমাত্র একটি মডেল ডায়ালগ দেখানোর জন্য প্রলুব্ধ হয়েছি, তবে এটি কিছুটা স্লেজহ্যামার ব্যবহার করার মতো মনে হয়।

ব্যবহারকারীরা এটি ঘৃণা করবে।


ধন্যবাদ এরিক, আমি অনুমান করি এটিই এর চূড়ান্ত উত্তর - এটি অ্যাপ্লিকেশন বিকাশকারীর হাতে।
নিকোলাস বাটলার

6

awaitকলটি সম্পূর্ণ নাজুক হলে আপনি কেন আগে বোতামটি অক্ষম করছেন এবং তারপরে এটি পুনরায় সক্ষম করবেন? আপনি কি উদ্বিগ্ন হয়ে আছেন যে বোতামটি আর কখনও সক্ষম হবে না?

ঠিক আছে, যদি কলটি ফিরে না আসে তবে আপনি আর কল করতে পারবেন না, সুতরাং মনে হচ্ছে এটি আপনার ইচ্ছা আচরণ। এটি একটি ত্রুটিযুক্ত অবস্থা নির্দেশ করে যা আপনার ঠিক করা উচিত। যদি আপনার অ্যাসিঙ্ক কলটি সময়ের বাইরে চলে যায় তবে এটি আপনার আবেদনটি অনির্দিষ্ট অবস্থায় ছেড়ে দিতে পারে - আবার এমন একটিতে যাতে বোতামটি সক্ষম করা বিপজ্জনক হতে পারে।

কেবলমাত্র যদি অবিচ্ছিন্ন হয়ে উঠতে পারে তবে যদি এমন কয়েকটি অপারেশন ঘটে যা একটি বোতামের অবস্থাকে প্রভাবিত করে তবে আমি মনে করি যে এই পরিস্থিতিগুলি খুব বিরল হওয়া উচিত।


অবশ্যই আপনাকে ত্রুটিগুলি পরিচালনা করতে হবে - আমি আমার প্রশ্নটি আপডেট করেছি
নিকোলাস বাটলার

5

আমি নিশ্চিত না যে এটি সাধারণত আপনার জন্য প্রযোজ্য কিনা আমি সাধারণত ডাব্লুপিএফ ব্যবহার করি তবে আমি আপনাকে দেখতে পাচ্ছি ViewModelযে এটি সম্ভবত কার্যকর হয়।

বোতামটি অক্ষম করার পরিবর্তে এতে একটি IsLoadingপতাকা সেট করুন true। তারপরে আপনি যে কোনও ইউআই উপাদান অক্ষম করতে চান তা পতাকাটিতে আবদ্ধ হতে পারে। শেষ ফলাফলটি হ'ল এটি আপনার ব্যবসায়ের লজিকের পরিবর্তে নিজস্ব সক্ষম রাষ্ট্রটিকে বাছাই করা UI এর কাজ হয়ে যায়।

এগুলি ছাড়াও, ডাব্লুপিএফ-এর বেশিরভাগ বোতামগুলি একটিতে আবদ্ধ ICommandথাকে এবং সাধারণত আমি ICommand.CanExecuteসমান সেট করে থাকি !IsLoading, তাই এটি স্বয়ংক্রিয়ভাবে কমান্ডটি কার্যকর করতে বাধা দেয় যখন ইসলয়েডিং সত্যের সমান হয় (আমার জন্য বোতামটিও অক্ষম করে)


3

আমি দেখেছি এমন ডেমোগুলিতে, তারা অপেক্ষা করার আগে বোতামটি অক্ষম করে এবং পরে আবার সক্ষম করে। এটি আমার কাছে বাস্তব-অ্যাপ্লিকেশনটিতে খুব ভঙ্গুর সমাধানের মতো মনে হয়।

এটি সম্পর্কে ভঙ্গুর কিছুই নেই, এবং এটিই ব্যবহারকারী প্রত্যাশা করবে। যদি আবার বোতামটি চাপার আগে ব্যবহারকারীর অপেক্ষা করতে হয় তবে তাদের অপেক্ষা করুন।

আমি দেখতে পাচ্ছি যে নির্দিষ্ট নিয়ন্ত্রণ পরিস্থিতিগুলি সিদ্ধান্ত নিতে পারে যে কোন নিয়ন্ত্রণগুলি যে কোনও সময়ে অক্ষম / সক্ষম করতে হবে যা জটিল জটিল, তবে কী অবাক করা বিষয় যে কোনও জটিল ইউআই পরিচালনা করা জটিল হবে? আপনার যদি একটি বিশেষ নিয়ন্ত্রণ থেকে অনেক বেশি ভয়ঙ্কর পার্শ্ব প্রতিক্রিয়া থেকে থাকে তবে আপনি সর্বদা পুরো ফর্মটি অক্ষম করতে পারেন এবং পুরো জিনিসটির উপরে "লোডিং" ছুঁড়ে ফেলতে পারেন। যদি প্রতিটি একক নিয়ন্ত্রণের ক্ষেত্রে এটি হয় তবে আপনার ইউআই সম্ভবত প্রথম স্থানে খুব ভালভাবে ডিজাইন করা হয়নি (টাইট কাপলিং, দুর্বল নিয়ন্ত্রণের দলবদ্ধকরণ ইত্যাদি)।


ধন্যবাদ - তবে কীভাবে জটিলতা পরিচালনা করবেন?
নিকোলাস বাটলার

একটি বিকল্প ধারক মধ্যে সম্পর্কিত নিয়ন্ত্রণ করা হবে। নিয়ন্ত্রণ দ্বারা নয় কন্ট্রোল কনটেইনার দ্বারা সক্ষম / সক্ষম করুন। যেমন: EditorControls.Foreach (c => c.En وړ = মিথ্যা);
মরগান হের্লোকার

2

উইজেট অক্ষম করা সবচেয়ে কম জটিল এবং ত্রুটি-প্রবণ বিকল্প। অ্যাসিঙ্ক অপারেশন শুরু করার আগে আপনি হ্যান্ডলারে এটি অক্ষম করুন এবং অপারেশন শেষে আপনি এটি পুনরায় সক্ষম করে। সুতরাং প্রতিটি নিয়ন্ত্রণের জন্য অক্ষম + সক্ষমকে সেই নিয়ন্ত্রণ পরিচালনা করার জন্য স্থানীয় রাখা হয়।

আপনি এমনকি একটি মোড়ক তৈরি করতে পারেন, এটি একটি প্রতিনিধি এবং নিয়ন্ত্রণ নেবে (বা তাদের আরও অনেকগুলি), নিয়ন্ত্রণগুলি অক্ষম করে এবং অবিচ্ছিন্নভাবে কিছু চালায় যা প্রতিনিধিটি করবে এবং নিয়ন্ত্রণগুলি পুনরায় সক্ষম করবে than এটি ব্যতিক্রমগুলির যত্ন নেওয়া উচিত (শেষ পর্যন্ত সক্ষম করুন), তাই অপারেশন ব্যর্থ হলে এটি এখনও নির্ভরযোগ্যভাবে কাজ করে। এবং আপনি এটি স্ট্যাটাস বারে বার্তা যুক্ত করার সাথে একত্রিত করতে পারেন, যাতে ব্যবহারকারী জানেন যে তিনি কীসের জন্য অপেক্ষা করছেন।

অক্ষমদের গণনা করার জন্য আপনি কিছু যুক্তি যুক্ত করতে চাইতে পারেন, সুতরাং আপনার দুটি অপারেশন থাকলে সিস্টেম কাজ করে চলেছে, এটি উভয়ই তৃতীয়টি অক্ষম করতে হবে তবে অন্যথায় পারস্পরিক একচেটিয়া নয়। আপনি নিয়ন্ত্রণটি দু'বার অক্ষম করেছেন, সুতরাং আপনি যদি আবার দু'বার সক্ষম করে থাকেন তবে এটি আবার সক্ষম হবে। আপনি পেতে পারেন যতটা কেস আলাদা রাখার সময় এটি বেশিরভাগ ক্ষেত্রে কভার করা উচিত।

অন্যদিকে স্টেট মেশিনের মতো কিছু জটিল হতে চলেছে। আমার অভিজ্ঞতায় আমি যে সমস্ত রাষ্ট্রীয় মেশিন দেখেছি সেগুলি রক্ষণাবেক্ষণ করা শক্ত ছিল এবং আপনার স্টেট মেশিনকে সমস্ত কিছুতে সবকিছু বেঁধে পুরো ডায়ালগটি আবদ্ধ করা দরকার।


ধন্যবাদ - আমি এই ধারণাটি পছন্দ করি তাহলে কী আপনার উইন্ডোতে এমন কোনও পরিচালক থাকতে পারে যা প্রতিটি নিয়ন্ত্রণের জন্য অক্ষম ও সক্ষম অনুরোধগুলির সংখ্যা গণনা করে?
নিকোলাস বাটলার

@ নিকবাটলার: আচ্ছা, আপনার কাছে ইতিমধ্যে প্রতিটি উইন্ডোটির জন্য একটি ম্যানেজার অবজেক্ট রয়েছে। ফর্মটি। সুতরাং আমি অনুরোধগুলি এবং গণনা বাস্তবায়নের একটি শ্রেণি চাই এবং কেবলমাত্র প্রাসঙ্গিক ফর্মগুলিতে উদাহরণ যোগ করব।
জানু হুডেক

1

যদিও জান হুডেক এবং রেচেল সম্পর্কিত ধারণা প্রকাশ করেছেন, আমি কোনও মডেল-ভিউ আর্কিটেকচারের মতো কিছু ব্যবহার করার পরামর্শ দেব - কোনও বস্তুর মধ্যে ফর্মের অবস্থাটি প্রকাশ করুন এবং ফর্মের উপাদানগুলিকে সেই অবস্থায় বেঁধে দিন। এটি আরও জটিল পরিস্থিতিগুলির জন্য স্কেল করতে পারে এমনভাবে বোতামটি অক্ষম করবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.