سؤال

فقط أتساءل ما الفرق بين BeginInvoke() و Invoke() ؟

أساسا ما كل واحد سوف تستخدم.

تحرير:ما هو الفرق بين خلق خيوط موضوع الدعوة الاحتجاج على ذلك فقط أتصل BeginInvoke() على تفويض ؟ أو هم نفس الشيء ؟

هل كانت مفيدة؟

المحلول

تعني تفويض.الاحتجاج/BeginInvoke أو التحكم.الاحتجاج/BeginInvoke?

  • مندوب.الاحتجاج:ينفذ بشكل متزامن في نفس الموضوع.
  • مندوب.BeginInvoke:ينفذ بشكل غير متزامن على threadpool الموضوع.
  • التحكم.الاحتجاج:ينفذ على UI ، ولكن موضوع الدعوة ينتظر الانتهاء قبل المتابعة.
  • التحكم.BeginInvoke:ينفذ على UI و موضوع الدعوة لا ينتظر الإنجاز.

تيم الجواب يذكر متى قد تحتاج إلى استخدام BeginInvoke - على الرغم من أنها كانت في معظمها موجهة نحو تفويض.BeginInvoke أظن.

ويندوز أشكال تطبيقات, وأود أن أقترح عليك أن عادة استخدام BeginInvoke.بهذه الطريقة أنت لا داعي للقلق حول الجمود ، على سبيل المثال - ولكن تحتاج إلى فهم أن واجهة المستخدم قد لا تم تحديثها في الوقت الذي المقبل ننظر في الأمر!وعلى وجه الخصوص ، يجب أن لا تعديل البيانات التي UI يمكن أن تستخدم لأغراض العرض.على سبيل المثال, إذا كان لديك شخص مع الاسم الأول و اسم العائلة خصائص و أنت لم:

person.FirstName = "Kevin"; // person is a shared reference
person.LastName = "Spacey";
control.BeginInvoke(UpdateName);
person.FirstName = "Keyser";
person.LastName = "Soze";

ثم واجهة المستخدم قد ينتهي عرض "كيزر سبيسي".(هناك فرصة ضئيلة فإنه يمكن عرض "كيفن سوزي" ولكن فقط من خلال غرابة من نموذج الذاكرة.)

إلا إذا كان لديك هذا النوع من المسألة بيد التحكم.BeginInvoke هو أسهل للحصول على حق و سوف تجنب الخلفية الخاصة بك الخيط من الاضطرار إلى الانتظار دون سبب وجيه.لاحظ أن النوافذ أشكال فريق ضمان أن يمكنك استخدام عنصر التحكم.BeginInvoke في "النار وننسى" الطريقة - أيمن دون أي وقت مضى داعيا EndInvoke.هذا ليس صحيحا async المكالمات بشكل عام:عادة كل BeginXXX يجب أن المقابلة EndXXX الدعوة ، عادة في الاستدعاء.

نصائح أخرى

وبناء على رد جون السكيت، وهناك أوقات عندما تريد استدعاء مندوب والانتظار لتنفيذه لإكمال قبل استمر الترابط الحالي. في هذه الحالات الدعوة استدعاء هو ما تريد.

في التطبيقات متعددة خيوط، قد لا ترغب في موضوع الانتظار على مندوب لإنهاء التنفيذ، خاصة إذا كان ذلك يؤدي مندوب I / O (التي يمكن أن تجعل من مندوب وكتلة الخيط الخاص بك).

في هذه الحالات سيكون BeginInvoke مفيد. بتسميته، وكنت قول مندوب لبدء ولكن بعد ذلك الخيط الخاص بك هو حر في أن يفعل أشياء أخرى بالتوازي مع مندوب.

<ع> استخدام BeginInvoke يزيد من تعقيد التعليمات البرمجية ولكن هناك أوقات عندما تحسن أداء يستحق التعقيد.

الفرق بين Control.Invoke() و Control.BeginInvoke() هو ،

  • BeginInvoke() سوف جدول غير متزامن العمل على واجهة المستخدم الرسومية الموضوع.عندما متزامن العمل المقرر الكود الخاص بك لا يزال مستمرا.بعض الوقت في وقت لاحق (أنت لا تعرف بالضبط متى) الخاص بك غير متزامن العمل سيتم تنفيذه
  • Invoke() سيتم تنفيذ الخاص بك غير متزامن العمل (على واجهة المستخدم الرسومية موضوع) وانتظر حتى العمل قد اكتمل.

الاستنتاج المنطقي هو أن مندوب يمكنك تمرير إلى Invoke() يمكن أن يكون خارج المعلمات أو العودة القيمة ، في حين مندوب يمكنك تمرير إلى BeginInvoke() لا (لديك لاستخدام EndInvoke لاسترداد النتائج).

فقط لإعطاء قصيرة, على سبيل المثال العمل لمعرفة تأثير الفرق

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");
}

إذا كان استخدام BeginInvoke, MessageBox الملوثات العضوية الثابتة في وقت واحد إلى نص التحديث.إذا كان استخدام الاحتجاج, MessageBox الملوثات العضوية الثابتة بعد 3 ثواني النوم.ومن هنا يظهر تأثير غير متزامن (BeginInvoke) و متزامن (الاحتجاج) المكالمة.

وDelegate.BeginInvoke () قوائم الانتظار بشكل متزامن دعوة مندوب والسيطرة على عوائد على الفور. عند استخدام Delegate.BeginInvoke ()، يجب عليك الاتصال Delegate.EndInvoke () في أسلوب رد اتصال للحصول على النتائج.

وDelegate.Invoke () يدعو متزامن المفوض في نفس الموضوع.

MSDN المادة

فقط إضافة لماذا و متى تستخدم في الاحتجاج().

سواء في الاحتجاج() و BeginInvoke() المشير الرمز الذي يحدد المرسل الموضوع.

ولكن على عكس BeginInvoke () استدعاء() الأكشاك الخيط الخاص بك حتى المرسل ينفذ التعليمات البرمجية الخاصة بك. قد ترغب في استخدام الاحتجاج() إذا كنت بحاجة إلى وقفة عملية غير متزامنة حتى المستخدم زودت نوع من ردود الفعل.

على سبيل المثال ، يمكنك دعوة الاحتجاج() لتشغيل مقتطف من التعليمات البرمجية التي تظهر موافق/إلغاء الأمر في مربع الحوار.بعد أن ينقر المستخدم على زر جهاز تنظيم رمز إكمال استدعاء الأسلوب() سيعود, و يمكنك العمل على استجابة المستخدم.

انظر برو WPF في C# الفصل 31

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top