শুধু ভাবছি কি মধ্যে পার্থক্য BeginInvoke()
এবং Invoke()
কারা?
প্রধানত প্রতিটি এক জন্য ব্যবহৃত হবে।
সম্পাদনা: থ্রেডিং অবজেক্ট তৈরি করা এবং তার উপর আহবান করা এবং কেবল BeginInvoke()
একটি প্রতিনিধিকে আহ্বান জানাতে পার্থক্য কী ? না তারা কি একই জিনিস?
শুধু ভাবছি কি মধ্যে পার্থক্য BeginInvoke()
এবং Invoke()
কারা?
প্রধানত প্রতিটি এক জন্য ব্যবহৃত হবে।
সম্পাদনা: থ্রেডিং অবজেক্ট তৈরি করা এবং তার উপর আহবান করা এবং কেবল BeginInvoke()
একটি প্রতিনিধিকে আহ্বান জানাতে পার্থক্য কী ? না তারা কি একই জিনিস?
উত্তর:
আপনার অর্থ Delegate.Invoke
/ BeginInvoke
বা Control.Invoke
/ BeginInvoke
?
Delegate.Invoke
: একই থ্রেডে, সুসংগতভাবে কার্যকর করে।Delegate.BeginInvoke
: একটি threadpool
থ্রেডে , অ্যাসিনক্রোনালি কার্যকর করে ।Control.Invoke
: ইউআই থ্রেডে কার্যকর করে, তবে থ্রেড কল করা চালিয়ে যাওয়ার আগে সম্পূর্ণ হওয়ার জন্য অপেক্ষা করে।Control.BeginInvoke
: ইউআই থ্রেডে কার্যকর করা হয় এবং থ্রেড কল করা সমাপ্তির জন্য অপেক্ষা করে না।টিমের উত্তরে উল্লেখ করা হয়েছে আপনি কখন ব্যবহার করতে চাইতে পারেন BeginInvoke
- যদিও এটি বেশিরভাগ দিকেই প্রস্তুত ছিল তবে Delegate.BeginInvoke
আমার সন্দেহ।
উইন্ডোজ ফর্ম অ্যাপ্লিকেশনগুলির জন্য, আমি আপনাকে পরামর্শ দিতে চাই যে সাধারণত ব্যবহার করা উচিত BeginInvoke
। এইভাবে আপনাকে অচলাবস্থার বিষয়ে চিন্তা করার দরকার নেই, উদাহরণস্বরূপ - তবে আপনাকে বুঝতে হবে যে আপনি পরবর্তী বারের দিকে তাকানোর সময় পর্যন্ত ইউআইটি আপডেট করা হয়নি! বিশেষত, ইউআই থ্রেডটি প্রদর্শিত হতে পারে এমন উদ্দেশ্যে ডেটা পরিবর্তন করতে হবে না। উদাহরণস্বরূপ, যদি আপনার Person
সাথে একটি FirstName
এবং LastName
বৈশিষ্ট্য থাকে এবং আপনি তা করেন:
person.FirstName = "Kevin"; // person is a shared reference
person.LastName = "Spacey";
control.BeginInvoke(UpdateName);
person.FirstName = "Keyser";
person.LastName = "Soze";
তারপরে ইউআই ভালভাবে "কীসার স্পেসি" প্রদর্শন করতে পারে। (বাইরের সুযোগ আছে এটি "কেভিন সোজে" প্রদর্শন করতে পারে তবে কেবল মেমরির মডেলের অদ্ভুততার মধ্য দিয়ে।)
আপনার যদি এই ধরণের সমস্যা না থাকে তবে Control.BeginInvoke
ডান পাওয়া সহজ এবং আপনার পটভূমির থ্রেডটি কোনও ভাল কারণে অপেক্ষা না করা থেকে বিরত রাখবে। নোট করুন যে উইন্ডোজ ফর্ম টিম গ্যারান্টি দিয়েছে যে আপনি Control.BeginInvoke
"ফায়ার এন্ড ভুলে" পদ্ধতিতে ব্যবহার করতে পারবেন - যেমন কখনও কল না করে EndInvoke
। এটি সাধারণভাবে অ্যাসিঙ্ক কলগুলির ক্ষেত্রে সত্য নয়: সাধারণত প্রতিটি বিগনিএক্সএক্সএক্সের সাধারণত এন্ডএক্সএক্সএক্সএক্স কল থাকা উচিত, সাধারণত কলব্যাকে।
জন স্কিটির জবাবের ভিত্তিতে এমন সময় আসে যখন আপনি কোনও প্রতিনিধিকে আহ্বান করতে চান এবং বর্তমান থ্রেডটি চালিয়ে যাওয়ার আগে এর সম্পাদন শেষ হওয়ার জন্য অপেক্ষা করতে চান। এই ক্ষেত্রে ইনভোক কলটি আপনি চান তা।
মাল্টি-থ্রেডিং অ্যাপ্লিকেশনগুলিতে, আপনি মৃত্যুদন্ড কার্যকর করার জন্য কোনও প্রতিনিধিটির জন্য অপেক্ষা করতে কোনও থ্রেড চাইবেন না, বিশেষত যদি সেই প্রতিনিধি I / O সম্পাদন করে (যা প্রতিনিধি এবং আপনার থ্রেড ব্লক করতে পারে)।
এই ক্ষেত্রে বিগইনভোক দরকারী হবে। এটিকে কল করে আপনি প্রতিনিধিটিকে শুরু করতে বলছেন তবে তারপরে আপনার থ্রেড প্রতিনিধিটির সাথে সমান্তরালভাবে অন্যান্য কাজগুলি করতে বিনামূল্যে।
বিগিনিউভোক ব্যবহার করা আপনার কোডের জটিলতা বাড়ায় তবে এমন সময় আসে যখন উন্নত পারফরম্যান্স জটিলতার জন্য মূল্যবান হয়।
Control.Invoke()
এবং মধ্যে পার্থক্য Control.BeginInvoke()
,
BeginInvoke()
জিইউআই থ্রেডে অ্যাসিনক্রোনাস অ্যাকশন নির্ধারণ করবে। যখন অ্যাসিক্রোনাস অ্যাকশন নির্ধারিত হয়, তখন আপনার কোড অব্যাহত থাকে। কিছু সময় পরে (আপনি ঠিক কখন জানেন না) আপনার অ্যাসিক্রোনাস ক্রিয়া কার্যকর করা হবেInvoke()
আপনার অ্যাসিক্রোনাস অ্যাকশন কার্যকর করবে (জিইউআই থ্রেড) এবং আপনার ক্রিয়া শেষ না হওয়া পর্যন্ত অপেক্ষা করবে।একটি যৌক্তিক উপসংহারটি হ'ল আপনি যে ডেলিগেটটি Invoke()
পাস BeginInvoke()
করেছেন তার বহিরাগত প্যারামিটার বা একটি রিটার্ন-ভ্যালু থাকতে পারে, যখন আপনি যে কোনও প্রতিনিধি পাস করেন তা করতে পারবেন না (ফলাফলগুলি পুনরুদ্ধার করতে আপনাকে এন্ডআইভোক ব্যবহার করতে হবে)।
তাদের পার্থক্যের প্রভাব দেখতে কেবল একটি সংক্ষিপ্ত, কার্যকারী উদাহরণ দিন example
new Thread(foo).Start();
private void foo()
{
this.Dispatcher.BeginInvoke(DispatcherPriority.Normal,
(ThreadStart)delegate()
{
myTextBox.Text = "bing";
Thread.Sleep(TimeSpan.FromSeconds(3));
});
MessageBox.Show("done");
}
যদি বিগিনিউভোক ব্যবহার করে তবে মেসেজবক্স টেক্সট আপডেটে একসাথে পপ করে। যদি ইনভোক ব্যবহার করেন তবে ম্যাসেজবক্স 3 সেকেন্ডের ঘুমের পরে পপ করবে। অতএব, একটি অ্যাসিনক্রোনাস ( বিগিনিউভোক ) এবং একটি সিঙ্ক্রোনাস ( ইনভোক ) কলের প্রভাব দেখাচ্ছে ।
ডেলিগেট.বেগিনইনভোকে () অবিচ্ছিন্নভাবে প্রতিনিধিদের ডাকে সারিবদ্ধভাবে তত্ক্ষণাত নিয়ন্ত্রণ ফিরে আসে। ডেলিগেট.বেগিনআইভোকে () ব্যবহার করার সময়, ফলাফল পাওয়ার জন্য আপনার কলিগব্যাক পদ্ধতিতে ডেলিগেট.এন্ডইনভোক () কল করা উচিত।
ডেলিগেট.ইনভোক () একই সংগে ডেলিগেটকে একই সাথে ডেকে আনে।
কেন এবং কখন ইনভোক () ব্যবহার করবেন তা কেবল যুক্ত করা হচ্ছে।
ইনভোক () এবং বিগিনিউভোক () উভয়ই মার্শাল কোডটিকে প্রেরণার থ্রেডে নির্দিষ্ট করে।
তবে বিগিনিভোকে () এর বিপরীতে, ইনভোক () প্রেরণকারী আপনার কোডটি কার্যকর না করা পর্যন্ত আপনার থ্রেড স্টল করে। ব্যবহারকারী কোনও ধরণের প্রতিক্রিয়া সরবরাহ না করা পর্যন্ত আপনার যদি একটি অ্যাসিঙ্ক্রোনাস অপারেশন বিরতি দেওয়া দরকার হয় তবে আপনি ইনভোক () ব্যবহার করতে চাইতে পারেন।
উদাহরণস্বরূপ, আপনি কোডের স্নিপেট চালানোর জন্য ইনভোক () কে কল করতে পারেন যা একটি ঠিক আছে / বাতিল ডায়ালগ বাক্সটি দেখায়। ব্যবহারকারীর একটি বোতাম ক্লিক করার পরে এবং আপনার মার্শেল কোড সম্পূর্ণ হওয়ার পরে, অনুরোধ () পদ্ধতিটি ফিরে আসবে এবং আপনি ব্যবহারকারীর প্রতিক্রিয়া অনুসারে কাজ করতে পারবেন।
প্রো # ডাব্লুপিএফ সি # অধ্যায়ে দেখুন