"কোনও অনুষ্ঠান চালিত না হওয়া পর্যন্ত কোড প্রবাহকে কীভাবে ব্লক করবেন?"
আপনার পদ্ধতিটি ভুল is ইভেন্ট-চালিত মানে কোনও ইভেন্টকে অবরুদ্ধ করা এবং অপেক্ষা করা নয়। আপনি কখনই অপেক্ষা করবেন না, অন্তত আপনি সর্বদা এড়াতে কঠোর চেষ্টা করুন। অপেক্ষারত সংস্থানগুলি নষ্ট করা, থ্রেডগুলি ব্লক করা এবং কোনও অচলাবস্থা বা জম্বি থ্রেডের ঝুঁকি প্রবর্তন করা (যদি রিলিজ সিগন্যাল কখনও উত্থাপিত না হয়)।
এটি পরিষ্কার হওয়া উচিত যে কোনও ইভেন্টের জন্য অপেক্ষা করতে থ্রেড ব্লক করা একটি অ্যান্টি-প্যাটার্ন কারণ এটি কোনও ইভেন্টের ধারণার সাথে বিরোধী।
আপনার কাছে সাধারণত দুটি (আধুনিক) বিকল্প রয়েছে: একটি অ্যাসিনক্রোনাস এপিআই বা ইভেন্ট-চালিত এপিআই প্রয়োগ করুন। যেহেতু আপনি আপনার এপিআই অ্যাসিঙ্ক্রোনাস বাস্তবায়ন করতে চান না, তাই আপনার ইভেন্ট-চালিত এপিআই ছেড়ে চলে যায়।
ইভেন্ট-চালিত এপিআই-এর মূল চাবিকাঠিটি হ'ল, কলারকে সিঙ্ক্রোনালি কোনও ফলাফলের জন্য অপেক্ষা করতে বা ফলাফলের জন্য পোলের জন্য চাপ দেওয়ার পরিবর্তে, আপনি ফলাফলটি প্রস্তুত হয়ে গেলে বা অপারেশন শেষ হয়ে গেলে আপনি কলারকে চালিয়ে যেতে এবং তাকে একটি বিজ্ঞপ্তি প্রেরণ করতে দেন। এদিকে, কলার অন্যান্য ক্রিয়াকলাপ চালিয়ে যেতে পারে।
থ্রেডিং দৃষ্টিকোণ থেকে সমস্যাটি দেখার সময়, ইভেন্ট-চালিত এপিআই, কলিং থ্রেড যেমন, ইউআই থ্রেড, যা বোতামের ইভেন্ট হ্যান্ডলারটি কার্যকর করে, যেমন ইউআই উপাদানগুলি রেন্ডারিংয়ের মতো অন্যান্য ইউআই সম্পর্কিত ক্রিয়াকলাপ পরিচালনা করতে মুক্ত হতে দেয় বা মাউস মুভমেন্ট এবং কী প্রেসের মতো ব্যবহারকারীর ইনপুট হ্যান্ডলিং। ইভেন্ট-চালিত এপিআইয়ের একটি অ্যাসিনক্রোনাস এপিআইয়ের মতো একই প্রভাব বা লক্ষ্য রয়েছে, যদিও এটি অনেক কম সুবিধাজনক।
যেহেতু আপনি সত্যিই কী করার চেষ্টা Utility.PickPoint()
করছেন , আসলে কী করছেন এবং টাস্কের ফলাফল কীভাবে বা ব্যবহারকারীকে `গ্রিডে ক্লিক করতে হবে সে সম্পর্কে আপনি পর্যাপ্ত বিশদ সরবরাহ করেননি , আমি আপনাকে আরও ভাল সমাধানের প্রস্তাব দিতে পারি না । আমি কীভাবে আপনার প্রয়োজনীয়তা বাস্তবায়িত করতে পারি তার একটি সাধারণ প্যাটার্ন অফার করতে পারি।
আপনার প্রবাহ বা লক্ষ্যটিকে অবশ্যই ক্রিয়াকলাপের সিক্যুয়েন্স করতে কমপক্ষে দুটি ধাপে বিভক্ত করা হয়েছে:
- অপারেশন 1 চালান, যখন ব্যবহারকারী বোতামটি ক্লিক করে
- অপারেশন 2 চালান (চালিয়ে যান / সম্পূর্ণ অপারেশন 1), যখন ব্যবহারকারী ক্লিক করে
Grid
কমপক্ষে দুটি বাধা সহ:
- Alচ্ছিক: ক্রমটি অবশ্যই এপিআই ক্লায়েন্টকে পুনরাবৃত্তি করার অনুমতি দেওয়ার আগে শেষ করতে হবে। অপারেশন 2 সম্পূর্ণ হওয়ার পরে একটি ক্রম সম্পূর্ণ হয়।
- অপারেশন 1 সর্বদা অপারেশন 2 এর আগে কার্যকর করা হয় 2 অপারেশন 1 ক্রম শুরু করে।
- এপিআই ক্লায়েন্টকে অপারেশন 2 চালানোর অনুমতি দেওয়ার আগে অপারেশন 1 অবশ্যই শেষ করতে হবে
এপিআই-র ক্লায়েন্টের জন্য অ-অবরুদ্ধ মিথস্ক্রিয়াটিকে মঞ্জুরি দেওয়ার জন্য এটি দুটি বিজ্ঞপ্তি (ইভেন্ট) এ প্রয়োজন:
- অপারেশন 1 সমাপ্ত (বা মিথস্ক্রিয়া প্রয়োজনীয়)
- অপারেশন 2 (বা লক্ষ্য) সম্পন্ন হয়েছে
আপনার এপিআইকে দু'টি পাবলিক পদ্ধতি এবং দুটি পাবলিক ইভেন্ট প্রকাশ করে এই আচরণ এবং প্রতিবন্ধকতাগুলি প্রয়োগ করতে দেওয়া উচিত।
যেহেতু এই বাস্তবায়নটি কেবলমাত্র API- এ একটি একক (অ-সমবর্তী) কলকে মঞ্জুরি দেয় এটি IsBusy
একটি চলমান ক্রমটি নির্দেশ করার জন্য কোনও সম্পত্তি প্রকাশ করার পরামর্শ দেয় recommended এটি নতুন ক্রম শুরু করার আগে বর্তমান অবস্থানে পোলিংয়ের অনুমতি দেয় যদিও পরবর্তী কলগুলি সম্পাদনের জন্য সম্পূর্ণ ইভেন্টটির জন্য অপেক্ষা করার পরামর্শ দেওয়া হয়।
প্রয়োগ / রিফ্যাক্টর ইউটিলিটি এপিআই
Utility.cs
class Utility
{
public event EventHandler InitializePickPointCompleted;
public event EventHandler<PickPointCompletedEventArgs> PickPointCompleted;
public bool IsBusy { get; set; }
private bool IsPickPointInitialized { get; set; }
// The prefix 'Begin' signals the caller or client of the API,
// that he also has to end the sequence explicitly
public void BeginPickPoint(param)
{
// Implement constraint 1
if (this.IsBusy)
{
// Alternatively just return or use Try-do pattern
throw new InvalidOperationException("BeginPickPoint is already executing. Call EndPickPoint before starting another sequence.");
}
// Set the flag that a current sequence is in progress
this.IsBusy = true;
// Execute operation until caller interaction is required.
// Execute in background thread to allow API caller to proceed with execution.
Task.Run(() => StartOperationNonBlocking(param));
}
public void EndPickPoint(param)
{
// Implement constraint 2 and 3
if (!this.IsPickPointInitialized)
{
// Alternatively just return or use Try-do pattern
throw new InvalidOperationException("BeginPickPoint must have completed execution before calling EndPickPoint.");
}
// Execute operation until caller interaction is required.
// Execute in background thread to allow API caller to proceed with execution.
Task.Run(() => CompleteOperationNonBlocking(param));
}
private void StartOperationNonBlocking(param)
{
... // Do something
// Flag the completion of the first step of the sequence (to guarantee constraint 2)
this.IsPickPointInitialized = true;
// Request caller interaction to kick off EndPickPoint() execution
OnInitializePickPointCompleted();
}
private void CompleteOperationNonBlocking(param)
{
// Execute goal and get the result of the completed task
Point result = ExecuteGoal();
// Reset API sequence (allow next client invocation)
this.IsBusy = false;
this.IsPickPointInitialized = false;
// Notify caller that execution has completed and the result is available
OnPickPointCompleted(result);
}
private void OnInitializePickPointCompleted()
{
// Set the result of the task
this.InitializePickPointCompleted?.Invoke(this, EventArgs.Empty);
}
private void OnPickPointCompleted(Point result)
{
// Set the result of the task
this.PickPointCompleted?.Invoke(this, new PickPointCompletedEventArgs(result));
}
}
PickPointCompletedEventArgs.cs
class PickPointCompletedEventArgs : AsyncCompletedEventArgs
{
public Point Result { get; }
public PickPointCompletedEventArgs(Point result)
{
this.Result = result;
}
}
এপিআই ব্যবহার করুন
MainWindow.xaml.cs
partial class MainWindow : Window
{
private Utility Api { get; set; }
public MainWindow()
{
InitializeComponent();
this.Api = new Utility();
}
private void StartPickPoint_OnButtonClick(object sender, RoutedEventArgs e)
{
this.Api.InitializePickPointCompleted += RequestUserInput_OnInitializePickPointCompleted;
// Invoke API and continue to do something until the first step has completed.
// This is possible because the API will execute the operation on a background thread.
this.Api.BeginPickPoint();
}
private void RequestUserInput_OnInitializePickPointCompleted(object sender, EventArgs e)
{
// Cleanup
this.Api.InitializePickPointCompleted -= RequestUserInput_OnInitializePickPointCompleted;
// Communicate to the UI user that you are waiting for him to click on the screen
// e.g. by showing a Popup, dimming the screen or showing a dialog.
// Once the input is received the input event handler will invoke the API to complete the goal
MessageBox.Show("Please click the screen");
}
private void FinishPickPoint_OnGridMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
this.Api.PickPointCompleted += ShowPoint_OnPickPointCompleted;
// Invoke API to complete the goal
// and continue to do something until the last step has completed
this.Api.EndPickPoint();
}
private void ShowPoint_OnPickPointCompleted(object sender, PickPointCompletedEventArgs e)
{
// Cleanup
this.Api.PickPointCompleted -= ShowPoint_OnPickPointCompleted;
// Get the result from the PickPointCompletedEventArgs instance
Point point = e.Result;
// Handle the result
MessageBox.Show(point.ToString());
}
}
MainWindow.xaml
<Window>
<Grid MouseLeftButtonUp="FinishPickPoint_OnGridMouseLeftButtonUp">
<Button Click="StartPickPoint_OnButtonClick" />
</Grid>
</Window>
মন্তব্য
একটি পটভূমি থ্রেডে উত্থাপিত ইভেন্টগুলি একই থ্রেডে তাদের হ্যান্ডলারগুলি কার্যকর করবে। একটি অ্যাক্সেস DispatcherObject
একটি হ্যান্ডলার, যা একটি পটভূমি থ্রেডে কার্যকর থেকে একটি UI 'তে উপাদান মত, প্রয়োজন সমালোচনামূলক অপারেশনে enqueued করা Dispatcher
ব্যবহার হয় Dispatcher.Invoke
বা Dispatcher.InvokeAsync
এড়াতে ক্রস থ্রেড ব্যতিক্রম। ডিসপ্যাচার অ্যাফিনিটি বা থ্রেড অ্যাফিনিটি নামে পরিচিত এই ঘটনাটি সম্পর্কে আরও
জানার DispatcherObject
জন্য মন্তব্যগুলি পড়ুন ।
এপিআই এর সুবিধাজনক ব্যবহারের জন্য আমি কলারের ক্যাপচার এবং ব্যবহার করে SynchronizationContext
বা AsyncOperation
(বা AsyncOperationManager
) ব্যবহার করে কলারের মূল প্রসঙ্গে সমস্ত ঘটনা মার্শাল করার পরামর্শ দিই ।
উপরোক্ত উদাহরণটি সহজেই বাতিলকরণ (প্রস্তাবিত) প্রদানের মাধ্যমে উদাহরণস্বরূপ কোনও Cancel()
পদ্ধতি উদঘাটন করে PickPointCancel()
এবং অগ্রগতি প্রতিবেদন (সাধারণত ব্যবহার করা Progress<T>
) সরবরাহ করে বাড়ানো যেতে পারে ।
কিছু চিন্তা - আপনার মন্তব্যের জবাব দিন
আপনি কনসোল অ্যাপ্লিকেশনগুলির উদাহরণ দিয়ে আমাকে একটি "আরও ভাল" ব্লকিং সমাধানের জন্য আমার কাছে পৌঁছেছিলেন বলে আমি আপনাকে বোঝাতে পেরেছি, আপনার ধারণা বা দৃষ্টিভঙ্গি সম্পূর্ণ ভুল is
"এতে এই দুটি লাইনের কোড সহ একটি কনসোল অ্যাপ্লিকেশন বিবেচনা করুন।
var str = Console.ReadLine();
Console.WriteLine(str);
আপনি যখন ডিবাগ মোডে অ্যাপ্লিকেশনটি কার্যকর করেন তখন কী হয়। এটি কোডের প্রথম লাইনে থামবে এবং আপনাকে কনসোল ইউআইতে একটি মান লিখতে বাধ্য করবে এবং তারপরে আপনি কিছু প্রবেশ করার পরে এন্টার টিপুন, এটি পরবর্তী লাইনটি কার্যকর করবে এবং আপনি যা লিখেছেন তা মুদ্রণ করবে। আমি ঠিক একই আচরণের কথা ভাবছিলাম কিন্তু ডব্লিউপিএফ অ্যাপ্লিকেশনটিতে। "
একটি কনসোল অ্যাপ্লিকেশন সম্পূর্ণ আলাদা কিছু। থ্রেডিং ধারণাটি কিছুটা আলাদা। কনসোল অ্যাপ্লিকেশনগুলির একটি জিইউআই নেই। কেবল ইনপুট / আউটপুট / ত্রুটি স্ট্রিম। আপনি একটি কনসোল অ্যাপ্লিকেশনটির আর্কিটেকচারকে একটি সমৃদ্ধ জিইউআই অ্যাপ্লিকেশনটির সাথে তুলনা করতে পারবেন না। এটি কাজ করবে না। আপনার অবশ্যই এটি বুঝতে এবং গ্রহণ করতে হবে।
এছাড়াও চেহারা দ্বারা প্রতারিত করবেন না । জানো ভিতরে কী হচ্ছে Console.ReadLine
? এটি কীভাবে বাস্তবায়ন হয় ? এটি কি মূল থ্রেডটি ব্লক করছে এবং সমান্তরালে এটি ইনপুটটি পড়ে? নাকি এটা ঠিক ভোটদান?
এর মূল বাস্তবায়ন এখানে Console.ReadLine
:
public virtual String ReadLine()
{
StringBuilder sb = new StringBuilder();
while (true)
{
int ch = Read();
if (ch == -1)
break;
if (ch == '\r' || ch == '\n')
{
if (ch == '\r' && Peek() == '\n')
Read();
return sb.ToString();
}
sb.Append((char)ch);
}
if (sb.Length > 0)
return sb.ToString();
return null;
}
আপনি দেখতে পাচ্ছেন এটি একটি সাধারণ সিঙ্ক্রোনাস অপারেশন। এটি "অসীম" লুপে ব্যবহারকারীর ইনপুট জন্য পোল করে। কোনও ম্যাজিক ব্লক এবং অবিরত নেই।
ডাব্লুপিএফ একটি রেন্ডারিং থ্রেড এবং একটি ইউআই থ্রেডের চারপাশে নির্মিত। ওএসের সাথে যোগাযোগের জন্য ব্যবহারকারীর ইনপুট হ্যান্ডল করার মতো - অ্যাপ্লিকেশনটিকে প্রতিক্রিয়াশীল রাখার জন্য এই থ্রেডগুলি সর্বদা ঘুরতে থাকে । আপনি কখনই এই থ্রেডটি বিরতি / অবরুদ্ধ করতে চান না কারণ এটি মাউস ইভেন্টগুলিতে প্রতিক্রিয়া জানানোর মতো আবশ্যক ব্যাকগ্রাউন্ডের কাজ করা থেকে কাঠামোকে থামিয়ে দেবে - আপনি মাউস হিমায়িত করতে চান না:
অপেক্ষমান = থ্রেড ব্লকিং = প্রতিক্রিয়াহীনতা = খারাপ ইউএক্স = বিরক্ত ব্যবহারকারী / গ্রাহকরা = অফিসে সমস্যা।
কখনও কখনও, অ্যাপ্লিকেশন প্রবাহের ইনপুট বা সম্পূর্ণ হওয়ার জন্য একটি রুটিনের জন্য অপেক্ষা করতে হয়। তবে আমরা মূল থ্রেডটি ব্লক করতে চাই না।
এজন্যই লোকেরা মূল থ্রেডটি ব্লক না করে এবং বিকাশকারীকে জটিল এবং ভ্রান্ত মাল্টিথ্রেডিং কোড লিখতে বাধ্য না করে অপেক্ষা করার অনুমতি দেওয়ার জন্য জটিল অ্যাসিনক্রোনাস প্রোগ্রামিং মডেলগুলি আবিষ্কার করেছিল।
প্রতিটি আধুনিক অ্যাপ্লিকেশন কাঠামো সহজ এবং দক্ষ কোডের বিকাশের অনুমতি দেওয়ার জন্য অ্যাসিনক্রোনাস অপারেশন বা একটি অ্যাসিনক্রোনাস প্রোগ্রামিং মডেল সরবরাহ করে।
আপনি যে অ্যাসিক্রোনাস প্রোগ্রামিং মডেলটির বিরুদ্ধে প্রতিরোধ করার জন্য কঠোর চেষ্টা করছেন তা আমার কাছে কিছুটা বোঝার অভাবকে দেখায়। প্রতিটি আধুনিক বিকাশকারী একটি সিনক্রোনাসের চেয়ে একটি অ্যাসিনক্রোনাস এপিআই পছন্দ করে। কোনও গুরুতর বিকাশকারী await
কীওয়ার্ডটি ব্যবহার করতে বা তার পদ্ধতিটি ঘোষণা করার বিষয়ে চিন্তা করে না async
। কেউ। আপনিই প্রথম আমার মুখোমুখি যিনি অ্যাসিক্রোনাস এপিআই সম্পর্কে অভিযোগ করেন এবং যিনি এগুলি ব্যবহার করতে অসুবিধেয় হন।
আমি তোমার ফ্রেমওয়ার্ক, যা লক্ষ্যমাত্রা UI 'তে সংশ্লিষ্ট সমস্যার সমাধানের বা UI' তে সংশ্লিষ্ট কাজগুলো সহজ করতে পরীক্ষা করেন, তাহলে আমি চাই আশা এটা অ্যাসিঙ্ক্রোনাস হতে - সব পথ।
ইউআই সম্পর্কিত সম্পর্কিত এপিআই যা অবিচ্ছিন্ন নয় তা অপচয়, কারণ এটি আমার প্রোগ্রামিং শৈলীকে জটিল করে তুলবে, তাই আমার কোড যা অতএব আরও ত্রুটি-প্রবণ এবং বজায় রাখা শক্ত হয়ে যায়।
একটি ভিন্ন দৃষ্টিভঙ্গি: আপনি যখন স্বীকার করেন যে ওয়েটিংটি ইউআই থ্রেডকে ব্লক করে দেয়, খুব খারাপ এবং অনাকাঙ্ক্ষিত ব্যবহারকারীর অভিজ্ঞতা তৈরি করছে যেহেতু ইউআই জমাটি অপেক্ষা শেষ না হওয়া পর্যন্ত হিমশীতল হয়ে পড়েছে, এখন আপনি যখন বুঝতে পেরেছেন, আপনি কেন এমন একটি এপিআই বা প্লাগইন মডেল সরবরাহ করবেন যা কোনও বিকাশকারীকে ঠিক এটি করতে উত্সাহ দেয় - অপেক্ষার প্রয়োগ করুন?
আপনি জানেন না যে তৃতীয় পক্ষের প্লাগইন কী করবে এবং একটি রুটিন সম্পূর্ণ না হওয়া পর্যন্ত কতক্ষণ সময় নেয়। এটি কেবল একটি খারাপ এপিআই নকশা। যখন আপনার এআইপিআই ইউআই থ্রেডে কাজ করে তখন আপনার এপিআই এর কলকারী অবশ্যই এতে অবরুদ্ধকরণ কল করতে সক্ষম হবেন।
আপনি যদি কেবলমাত্র সস্তা বা করুণামুক্ত সমাধানটিকে অস্বীকার করেন, তবে আমার উদাহরণে প্রদর্শিত হিসাবে ইভেন্ট-চালিত পদ্ধতির ব্যবহার করুন।
এটি আপনি যা চান তা করে: একটি রুটিন শুরু করুন - ব্যবহারকারী ইনপুটটির জন্য অপেক্ষা করুন - সম্পাদন চালিয়ে যান - লক্ষ্য অর্জন করুন।
ওয়েটিং / ব্লক করা কেন খারাপ অ্যাপ্লিকেশন ডিজাইন, তা বোঝাতে আমি বেশ কয়েকবার চেষ্টা করেছি। আবার, আপনি কোনও কনসোল ইউআইকে একটি সমৃদ্ধ গ্রাফিক্যাল ইউআইয়ের সাথে তুলনা করতে পারবেন না, যেখানে উদাহরণস্বরূপ ইনপুট হ্যান্ডলিং কেবলমাত্র ইনপুট স্ট্রিম শোনার চেয়ে আরও বেশি জটিল। আপনার অভিজ্ঞতার স্তরটি এবং আপনি কোথায় শুরু করেছেন তা আমি সত্যিই জানি না তবে আপনার অ্যাসিক্রোনাস প্রোগ্রামিং মডেলটি আলিঙ্গন করা উচিত। আপনি এটি এড়ানোর চেষ্টা করার কারণটি আমি জানি না। তবে এটা মোটেই বুদ্ধিমানের কাজ নয়।
আজ অ্যাসিনক্রোনাস প্রোগ্রামিং মডেলগুলি প্রতিটি প্ল্যাটফর্ম, সংকলক, প্রতিটি পরিবেশ, ব্রাউজার, সার্ভার, ডেস্কটপ, ডাটাবেস - সর্বত্র প্রয়োগ করা হয়। ইভেন্ট-চালিত মডেল একই লক্ষ্য অর্জনে অনুমতি দেয় তবে পটভূমির থ্রেডের উপর নির্ভর করে, ইভেন্টগুলি সম্পর্কে জানতে শিখতে (ইভেন্টগুলি / থেকে সাবস্ক্রাইব / সাবস্ক্রাইব করুন, ডকস পড়ুন) ইভেন্ট-চালিত পুরানো ফ্যাশনযুক্ত এবং কেবল তখনই ব্যবহার করা উচিত যখন অ্যাসিক্রোনাস লাইব্রেরি উপলব্ধ না হয় বা প্রযোজ্য হয় না।
পার্শ্ব-নোট হিসাবে:। নেট ফ্রেমওয়ার্ক (। নেট স্ট্যান্ডার্ড) TaskCompletionSource
একটি বিদ্যমান সম -চালিত এপিআইকে একটি অ্যাসিনক্রোনাস এপিআইতে রূপান্তর করার একটি সহজ উপায় সরবরাহ করার জন্য (অন্যান্য উদ্দেশ্যগুলির মধ্যে ) সরবরাহ করে ।
"আমি অটোডেস্ক রিভিটে সঠিক আচরণটি দেখেছি।"
আচরণটি (আপনি যা অনুভব করেন বা পর্যবেক্ষণ করেন) এই অভিজ্ঞতা কীভাবে প্রয়োগ করা হয় তার থেকে অনেক আলাদা। দুটি ভিন্ন জিনিস। আপনার অটোডেস্ক সম্ভবত অ্যাসিনক্রোনাস লাইব্রেরি বা ভাষার বৈশিষ্ট্য বা অন্য কোনও থ্রেডিং প্রক্রিয়া ব্যবহার করছে। এবং এটি প্রাসঙ্গিক সম্পর্কিতও। আপনার মনে যে পদ্ধতিটি কোনও পটভূমির থ্রেডে চালিত হয় তখন বিকাশকারী এই থ্রেডটি ব্লক করতে পছন্দ করতে পারেন। এটি করার জন্য তার কাছে খুব ভাল কারণ রয়েছে বা তিনি একটি খারাপ নকশা পছন্দ করেছেন choice আপনি সম্পূর্ণ ভুল পথে আছেন;) ব্লক করা ভাল নয় is
(অটোডেস্ক সোর্স কোড ওপেন সোর্স? বা কীভাবে এটি বাস্তবায়ন হয় আপনি কীভাবে জানেন?)
আমি আপনাকে অসন্তুষ্ট করতে চাই না, দয়া করে আমাকে বিশ্বাস করুন। তবে দয়া করে আপনার এপিআই অ্যাসিক্রোনাস বাস্তবায়নের জন্য পুনর্বিবেচনা করুন। এটি কেবল আপনার মাথায় রয়েছে যে বিকাশকারীরা async / অপেক্ষা করতে পছন্দ করেন না। আপনি অবশ্যই ভুল মানসিকতা পেয়েছেন। এবং সেই কনসোল অ্যাপ্লিকেশন আর্গুমেন্টটি সম্পর্কে ভুলে যান - এটি বোকামি;)
UI সম্পর্কিত এআইপিআই async ব্যবহার করা / যখনই সম্ভব অপেক্ষা করা আবশ্যক । অন্যথায়, আপনি আপনার API এর ক্লায়েন্টকে নন-ব্লকিং কোড লেখার জন্য সমস্ত কাজ ছেড়ে যান আপনি আমাকে আপনার এপিআইতে প্রতিটি কল একটি পটভূমির থ্রেডে আবদ্ধ করতে বাধ্য করবেন। বা কম আরামদায়ক ইভেন্ট হ্যান্ডলিং ব্যবহার করতে। আমাকে বিশ্বাস করুন - প্রতিটি বিকাশকারী async
ইভেন্ট হ্যান্ডলিংয়ের চেয়ে বরং তার সদস্যদের সাথে সজ্জিত করে । প্রতিবার আপনি ইভেন্টগুলি ব্যবহার করার সময় আপনি একটি সম্ভাব্য মেমরি ফাঁসের ঝুঁকি নিতে পারেন - এটি কিছু পরিস্থিতিতে নির্ভর করে, তবে ঝুঁকিটি বাস্তব এবং বিরল না হয়ে প্রোগ্রামিং করার সময় ঘটে।
আমি সত্যিই আশা করি আপনি বুঝতে পেরেছেন কেন ব্লক করা খারাপ। আমি সত্যিই আশা করি আপনি একটি অ্যাসিঙ্ক ব্যবহার করার সিদ্ধান্ত নিয়েছেন / একটি আধুনিক অ্যাসিনক্রোনাস এপিআই লেখার জন্য অপেক্ষা করবেন। তবুও, ইভেন্টগুলি ব্যবহার করে আপনাকে অ-ব্লক করা অপেক্ষার খুব সাধারণ উপায়টি আমি আপনাকে দেখিয়েছি, যদিও আমি আপনাকে async / অপেক্ষার জন্য অনুরোধ করছি।
"এপিআই প্রোগ্রামারটিকে ইউআই এবং ইত্যাদির অ্যাক্সেসের অনুমতি দেবে। এখন ধরুন প্রোগ্রামার একটি অ্যাড-ইন বিকাশ করতে চায় যে যখন একটি বোতাম ক্লিক করা হয়, চূড়ান্ত ব্যবহারকারীকে ইউআইতে একটি বিন্দু বাছাই করতে বলা হয়"
আপনি যদি প্লাগইনটিকে ইউআই উপাদানগুলিতে সরাসরি অ্যাক্সেসের অনুমতি দিতে না চান তবে আপনার ইভেন্টগুলি ডেলিগেট করতে বা বিমূর্ত বস্তুর মাধ্যমে অভ্যন্তরীণ উপাদানগুলি প্রকাশের জন্য একটি ইন্টারফেস সরবরাহ করা উচিত।
এপিআই অভ্যন্তরীণভাবে অ্যাড-ইন এর পক্ষে ইউআই ইভেন্টগুলিতে সদস্যতা নেবে এবং তারপরে এপিআই ক্লায়েন্টের সাথে সম্পর্কিত "র্যাপার" ইভেন্টটি প্রকাশ করে ইভেন্টটি প্রতিনিধিত্ব করবে। আপনার এপিআইতে অবশ্যই কিছু হুক সরবরাহ করতে হবে যেখানে নির্দিষ্ট অ্যাপ্লিকেশন উপাদানগুলিতে অ্যাড-ইন সংযোগ করতে পারে connect একটি প্লাগইন এপিআই ইন্টার্নালগুলিতে বহিরাগতদের অ্যাক্সেস দিতে অ্যাডাপ্টারের মতো বা সম্মুখের মতো কাজ করে।
ডিগ্রি বিচ্ছিন্নতা অনুমতি দেয়।
ভিজ্যুয়াল স্টুডিও কীভাবে প্লাগইন পরিচালনা করে বা সেগুলি প্রয়োগ করতে আমাদের সহায়তা করে তা একবার দেখুন। আপনি ভিজ্যুয়াল স্টুডিওর জন্য একটি প্লাগইন লিখতে চান তা ভান করুন এবং এটি কীভাবে করবেন সে সম্পর্কে কিছু গবেষণা করুন। আপনি বুঝতে পারবেন যে ভিজ্যুয়াল স্টুডিও একটি ইন্টারফেস বা এপিআইয়ের মাধ্যমে এর ইন্টার্নালগুলি প্রকাশ করে। যেমন আপনি কোড সম্পাদক নিপূণভাবে বা ছাড়া সম্পাদকের বিষয়বস্তু সম্পর্কে তথ্য পেতে পারেন বাস্তব এটি অ্যাক্সেস।
Aync/Await
কীভাবে অপারেশন এ করছেন এবং সেই অপারেশন স্টেটটি সংরক্ষণ করবেন এখন আপনি চান যে ব্যবহারকারীর গ্রিড ক্লিক করা উচিত .. সুতরাং যদি ব্যবহারকারী ক্লিক করে গ্রিড আপনি যদি রাষ্ট্রটি পরীক্ষা করে থাকেন তবে আপনার অপারেশনটি যা করতে চান তা করুন ??