ইনভোক () এবং বিগিনিউভোক () এর মধ্যে পার্থক্য কী


398

শুধু ভাবছি কি মধ্যে পার্থক্য BeginInvoke()এবং Invoke()কারা?

প্রধানত প্রতিটি এক জন্য ব্যবহৃত হবে।

সম্পাদনা: থ্রেডিং অবজেক্ট তৈরি করা এবং তার উপর আহবান করা এবং কেবল BeginInvoke()একটি প্রতিনিধিকে আহ্বান জানাতে পার্থক্য কী ? না তারা কি একই জিনিস?

উত্তর:


568

আপনার অর্থ 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। এটি সাধারণভাবে অ্যাসিঙ্ক কলগুলির ক্ষেত্রে সত্য নয়: সাধারণত প্রতিটি বিগনিএক্সএক্সএক্সের সাধারণত এন্ডএক্সএক্সএক্সএক্স কল থাকা উচিত, সাধারণত কলব্যাকে।


4
তাহলে পিপিএল কেন ইনভোকের উপরে ইনভোক ব্যবহার করবে? ইনভোক ব্যবহার করে কিছু সুবিধা থাকা উচিত নয়। উভয় ব্যাকগ্রাউন্ডে প্রক্রিয়াগুলি চালায়, কেবল একটি একই থ্রেডে রয়েছে, অন্যটি বিভিন্ন থ্রেডে রয়েছে?
ইয়াইন

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

6
@ শার্পউরব্রেইন: কন্ট্রোল.বেগিনআইভোকটি ডিসপ্যাচার.বেগিনইনভোকের সমতুল্য, তবে উইনফোর্মে (যেখানে ডিসপ্যাচার ডাব্লুপিএফ এবং সিলভারলাইটের জন্য)।
জন স্কিটি

4
@ শার্পউরব্রেইন: আমি আপনাকে মন্তব্যগুলিতে চালিয়ে যাওয়ার পরিবর্তে একটি নির্দিষ্ট প্রশ্ন জিজ্ঞাসা করার পরামর্শ দেব - এবং অবশ্যই একই প্রশ্নটি ইতিমধ্যে অন্য কেউ জিজ্ঞাসা করেছেন কিনা তা পরীক্ষা করে দেখুন।
জন স্কিটি

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

46

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

মাল্টি-থ্রেডিং অ্যাপ্লিকেশনগুলিতে, আপনি মৃত্যুদন্ড কার্যকর করার জন্য কোনও প্রতিনিধিটির জন্য অপেক্ষা করতে কোনও থ্রেড চাইবেন না, বিশেষত যদি সেই প্রতিনিধি I / O সম্পাদন করে (যা প্রতিনিধি এবং আপনার থ্রেড ব্লক করতে পারে)।

এই ক্ষেত্রে বিগইনভোক দরকারী হবে। এটিকে কল করে আপনি প্রতিনিধিটিকে শুরু করতে বলছেন তবে তারপরে আপনার থ্রেড প্রতিনিধিটির সাথে সমান্তরালভাবে অন্যান্য কাজগুলি করতে বিনামূল্যে।

বিগিনিউভোক ব্যবহার করা আপনার কোডের জটিলতা বাড়ায় তবে এমন সময় আসে যখন উন্নত পারফরম্যান্স জটিলতার জন্য মূল্যবান হয়।


27

Control.Invoke()এবং মধ্যে পার্থক্য Control.BeginInvoke(),

  • BeginInvoke()জিইউআই থ্রেডে অ্যাসিনক্রোনাস অ্যাকশন নির্ধারণ করবে। যখন অ্যাসিক্রোনাস অ্যাকশন নির্ধারিত হয়, তখন আপনার কোড অব্যাহত থাকে। কিছু সময় পরে (আপনি ঠিক কখন জানেন না) আপনার অ্যাসিক্রোনাস ক্রিয়া কার্যকর করা হবে
  • Invoke() আপনার অ্যাসিক্রোনাস অ্যাকশন কার্যকর করবে (জিইউআই থ্রেড) এবং আপনার ক্রিয়া শেষ না হওয়া পর্যন্ত অপেক্ষা করবে।

একটি যৌক্তিক উপসংহারটি হ'ল আপনি যে ডেলিগেটটি Invoke()পাস BeginInvoke()করেছেন তার বহিরাগত প্যারামিটার বা একটি রিটার্ন-ভ্যালু থাকতে পারে, যখন আপনি যে কোনও প্রতিনিধি পাস করেন তা করতে পারবেন না (ফলাফলগুলি পুনরুদ্ধার করতে আপনাকে এন্ডআইভোক ব্যবহার করতে হবে)।


20

তাদের পার্থক্যের প্রভাব দেখতে কেবল একটি সংক্ষিপ্ত, কার্যকারী উদাহরণ দিন 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 সেকেন্ডের ঘুমের পরে পপ করবে। অতএব, একটি অ্যাসিনক্রোনাস ( বিগিনিউভোক ) এবং একটি সিঙ্ক্রোনাস ( ইনভোক ) কলের প্রভাব দেখাচ্ছে ।


9

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

ডেলিগেট.ইনভোক () একই সংগে ডেলিগেটকে একই সাথে ডেকে আনে।

এমএসডিএন আর্টিকেল


8

কেন এবং কখন ইনভোক () ব্যবহার করবেন তা কেবল যুক্ত করা হচ্ছে।

ইনভোক () এবং বিগিনিউভোক () উভয়ই মার্শাল কোডটিকে প্রেরণার থ্রেডে নির্দিষ্ট করে।

তবে বিগিনিভোকে () এর বিপরীতে, ইনভোক () প্রেরণকারী আপনার কোডটি কার্যকর না করা পর্যন্ত আপনার থ্রেড স্টল করে। ব্যবহারকারী কোনও ধরণের প্রতিক্রিয়া সরবরাহ না করা পর্যন্ত আপনার যদি একটি অ্যাসিঙ্ক্রোনাস অপারেশন বিরতি দেওয়া দরকার হয় তবে আপনি ইনভোক () ব্যবহার করতে চাইতে পারেন।

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

প্রো # ডাব্লুপিএফ সি # অধ্যায়ে দেখুন

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