عندما نكتب برامج عن بعد أو تطبيقات أخرى، يتعين علينا حتماً التعامل مع سلاسل الرسائل. يتيح لنا برنامج Net إنشاء سلسلة رسائل بسهولة، لكن الأساليب التي يوفرها لإنشاء سلاسل المحادثات وبدء سلاسل الرسائل لا توفر معلمات واضحة إذا كان علينا أن نفعل ذلك إذا كنت أرغب في استخدام مؤشر ترابط لبدء طريقة تحتوي على معلمات في الفصل الدراسي؟ فيما يلي مقدمة مختصرة حول كيفية استخدام إطار العمل الغني الذي يوفره .NET لتنفيذ هذه الوظيفة. من أجل تقديم العملية برمتها بتفاصيل واضحة، قمت بإنشاء فئة .NET التالية، والتي تعد أيضًا الناقل لطريقة بدء تشغيل الخيط. يبدو الفصل كما يلي:
استخدام النظام؛
namespace WindowsApplication1
{
/// <summary>
/// وصف ملخص لـ UrlFetcher
/// </summary>
public class MyClass{.
// للطريقة الأولى
سلسلة خاصة _ معلمة؛
public MyClass(stringparameter){
this._parameter =parameter;
}
public void MyMethod1(){
if(this._parameter!=null){
// افعل شيئًا
Console.Write(this._parameter );
}
}
// للطريقة الثانية
public MyClass(){}
// هذه الطريقة خاصة، ولكن يمكن أن تكون عامة أو
خاصة void MyMethod2(string Parameter){
// افعل شيئًا
Console.Write(parameter)
}
// لأن المفوض WaitCallback's نوع المعلمة هو كائن
// سأقوم بتحويله إلى سلسلة
public void MyMethod2(object Parameter){
this.MyMethod2((string)parameter
}
);
// للطريقة الثالثة
public string MyMethod3(stringparameter){
return "قيمة المعلمة هي:"+parameter
}
// بالنسبة لمعلمات mutil التي تم تمريرها
public string MyMutilParameters(string param1,string param2){
return "نتيجة اتصال المعلمة 1 والمعلمة 2 هي: "+param1+param2
}
}
}
هيهي، لغتي الإنجليزية ليست جيدة، من فضلك سامحني على سوء كتابة التعليقات (لأنها باللغة الإنجليزية). أعتقد أنه من الضروري بالنسبة لي أن أتحدث بإيجاز عن المحتوى الموجود في الفصل أعلاه. أولاً، يحتوي على مُنشئين، أحدهما به معلمات والآخر بدون (تم ترتيب هذا عن قصد). أعتقد أنك ستخمن ذلك من خلال أسماء الطرق الأخرى في الفصل، وسأقدم 3 طرق لتمرير المعلمات، ثم سأقدمها واحدة تلو الأخرى. أولاً، دعونا نلقي نظرة على كيفية بدء سلسلة رسائل. أولاً، يمكننا استخدام وظيفة لإنشاء مثيل لمفوض ThreadStart، ثم استخدام هذا المثيل ككائن مؤشر ترابط جديد (خيط)، وأخيرًا بدء سلسلة الرسائل معرفة المزيد يرجى الرجوع إلى قسم سلسلة الرسائل في وثائق MSDN لمزيد من المعلومات.
من أجل اختبار نتائجنا، قمت بإنشاء مشروع WinForm، الذي يحتوي على نموذج وأربعة أزرار. إذا كنت بحاجة إلى كل الكود المصدري، يرجى إرسال بريد إلكتروني إلى [email protected] وسأرسله إليك إذا كان لدي الوقت . وفيما يلي وصف تفصيلي لكل طريقة.
1. استخدم المُنشئ لتمرير المعلمات
، كما نعلم جميعًا، يمكننا استخدام المُنشئ مع المعلمات لإنشاء كائن المتغيرات الداخلية في الكائن، ثم استخدم طريقة مُنشئ بدون معلمات لاستخدام هذه المعلمة (تتظاهر بأنها معلمة). بكل بساطة، قم بإعلان متغير في الفصل خصيصًا لحفظ المعلمات التي تتطلبها الوظيفة، وتصبح الوظيفة نموذجًا بدون معلمات. أكبر مشكلة في هذه الطريقة هي أنها تدمر التغليف. على الرغم من أننا لا نستطيع الوصول مباشرة إلى هذه المتغيرات، إلا أن المخاطر الخفية موجودة دائمًا (أو لا يهم إذا كانت تبدو غير سارة). يوفر مقتطف التعليمات البرمجية التالي تفاصيل حول كيفية استخدام هذه الطريقة لتمرير المعلمات. وهذا أيضًا هو رمز النقر لأحد الأزرار الأربعة المذكورة أعلاه (Button1). من أجل تمرير المعلمات، قمت بتعريف متغير على النحو التالي عالميًا في WinForm:
//
هذه
هي
قيمة المعلمة
سلسلة خاصة myParameter = "ParameterValuen"؛
void Button1_Click(object sender, System.EventArgs e) {
MyClass example = new MyClass(myParameter);
new Thread(new ThreadStart(instance.MyMethod1)).Start();
}
كما ذكرنا أعلاه، نستخدم المُنشئ لتمرير المعلمات إليه فئة Go، ثم ابدأ سلسلة محادثات باستخدام الطريقة المذكورة أعلاه، يمكننا رؤية نتيجة تنفيذ MyMethod1 في نافذة الإخراج بعد تشغيل البرنامج (يمكنك أيضًا استخدام TextBox أو أي شيء آخر لعرضه مباشرة على WinForm): قيمة المعلمة. ما عليك سوى إلقاء نظرة على نص الوظيفة وسترى أن النتيجة صحيحة. أليس الأمر بسيطًا جدًا؟
2. استخدم ThreadPool لتحقيق نقل المعلمات
يمكننا أولاً أن ننظر إلى كيفية وصف MSDN لـ ThreadPool الذي يوفر مجموعة من سلاسل العمليات التي يمكن استخدامها لنشر عناصر العمل ومعالجة الإدخال / الإخراج غير المتزامن والانتظار نيابة عن سلاسل العمليات الأخرى ومؤقتات المعالجة. قم بعرض مجموعة الأساليب الخاصة بها، والتي تسمى إحداها: QueueUserWorkItem للحصول على معلومات مفصلة حول هذه الفئة وهذه الطريقة، يرجى الرجوع إلى تعليمات MSDN ذات الصلة. ما يجب ملاحظته هنا هو معلمات طريقة QueueUserWorkItem، المعلمة WaitCallback هي نوع مفوض، المعلمة الثانية هي المعلمة المطلوبة من قبل مثيل المفوض (بعد إنشاء مثيل لها بوظيفة، أي وظيفة). من نوع الكائن. يرجى الاطلاع على الكود أدناه للحصول على التفاصيل.
// مرر المعلمة إلى مؤشر الترابط بواسطة ThreadPool
Private
void Button2_Click(object sender, System.EventArgs e) {
MyClass
مثيل = new MyClass()
;
من QueueUserWorkItem المعلمات من نوع الكائن، لذلك نحتاج إلى تحديد نسختين تم تغيير حجمهما من MyMethod2 في MyClass لتلبية معلمات الطريقة. وبالمثل، قمنا بتمرير المعلمة myParameter وتشغيل البرنامج عندما ننقر فوق Button2، ستظهر نتيجة تنفيذ MyMethod2 myParameter كمعلمة في نافذة الإخراج.
3. التالي هو الطريقة الأخيرة لاستخدام التفويض غير المتزامن لتحقيق نقل المعلمات
. وبالمثل، للحصول على معلومات مفصلة حول التفويض، يرجى الرجوع إلى MSDN، وهو مفصل للغاية أعلاه. سنستخدم أساليب BeginInvoc وEndInvoc هنا. أولاً، نعطي طريقة تمرير المعلمة كما يلي:
//
تم تمرير المعلمة بواسطة مندوب غير متزامن
string
MyMethod3Delegate(stringparameter)
;
myMethod3 = new MyMethod3Delegate(instance.MyMethod3);
myMethod3.BeginInvoc("parameterValue",new AsyncCallback(AfterMyMothod3),null);
public
void AfterMyMothod3(IAsyncResult result){
AsyncResult async = (AsyncResult) result;
thod3Delegate) async.AsyncDelegate;
Console.WriteLine ("قيمة إرجاع استدعاء الدالة: {0}n"، DelegateInstance.EndInvoc(result)
}
أولاً، من أجل استخدام المفوض، نعلن عن مفوض MyMethod3Delegate، الذي يحدد المعلمة ووظائف القيمة المرجعة التي تمثل سلاسل مؤهلة، لذلك نحدد طريقة MyMethod3 في MyClass. يتوافق هيكل هذه الوظيفة مع المفوض أعلاه، لذا يمكننا استخدام هذه الطريقة لإنشاء مثيل للمفوض عند النقر فوق Button3، ثم نستدعي هذه الطريقة بشكل غير متزامن للحصول على نتيجة الإرجاع، كتبنا طريقة AfterMyMothod3 لعرضها نتائج تنفيذ الوظيفة قم بتشغيل البرنامج وانقر فوق Button3 لترى أن نتائج الإخراج في الإخراج هي نتائج تنفيذ MyMethod3 مع المعلمات. أخيرًا، أقدم طريقة حول كيفية تمرير معلمات متعددة، المثال الخاص بي هو تمرير معلمتين. الكود كما يلي:
// mutil-parameters مرت
سلسلة المندوب MyMutilParamsDelegate(string Parameter1,string Parameter2);
Private void Button4_Click(object sender, System.EventArgs e) {
MyClass مثيل =new
MyClass();
example.MyMutilParameters );
mutilParams.BeginInvoc("param1",params2,new AsyncCallback(AfterMutilParams),null })
;
public void AfterMutilParams(IAsyncResult result){
AsyncResult async = (AsyncResult) result;
MyMutilParamsDelegate DelegateInstance = (MyMutilParamsDelegate) async.AsyncDelegate;
Console.WriteLine ("استدعاء دالة متعددة المعلمات يُرجع النتيجة: {0}n"، DelegateInstance.EndInvoc( result ));
}
نظرًا لضيق المساحة، لن يتم شرح الكود بالتفصيل. يرجى تصحيح لي إذا كان هناك أي عدم دقة شكرا لك على القراءة! معلومات الاتصال: [email protected] معرف منتدى CSDN: cuike519
المستندات المرجعية: