كيفية التعامل مع Threadpool ومتغيرات الأعضاء؟
-
11-09-2019 - |
سؤال
أنا جديد بعض الشيء في الخيوط في .NET. كنت أتساءل، إذا استطعت إرسال كائن واحد فقط إلى طريقة رد الاتصال بي، كيف يمكنني الوصول إلى متغير عضو الفصل للاتصال بطرقها؟ (انظر CustomClass في رد الاتصال ())
وكيف يمكنني تحميل البيانات من العرف؟ هل اجتاز العرف إلى طريقة اتصال مختلفة؟ هل هذا النهج بخير؟
كما ترون أنه من القليل من الخبرة، لذا فإن أي نصائح على طول الطريق سيكون موضع تقدير حقا.
شكرا لك، كايف
class Program
{
static void Main(string[] args)
{
CustomClass customClass = new CustomClass();
ThreadPool.QueueUserWorkItem(CallBack, "Hello");
Console.Read();
}
private static void CallBack(object state)
{
customClass.SaveData(state.ToString());
}
}
المحلول
class Program
{
static void Main(string[] args)
{
CustomClass customClass = new CustomClass();
ThreadPool.QueueUserWorkItem(x => CallBack(customClass, "Hello"));
Console.Read();
}
private static void CallBack(CustomClass custom, string text)
{
customClass.SaveData(text);
}
}
نصائح أخرى
أسهل طريقة للقيام بذلك هي استخدام إنهاء لالتقاط جميع المتغيرات التي تريدها (أي استخدام طريقة مجهولة أو تعبير لامدا). عليك أن تكون حذرا حول ما تم التقاطه بالضبط إذا كنت تستخدم حلقة، لكنها هندم من تمرير كائن وتضطر إلى إلقاء عليه مرة أخرى إلى النوع الصحيح إلخ.
بالإضافة إلى ما قيل: إذا CustomClass
تحت سيطرتك واستدعاء غير متزامن SaveData
هي حالة الاستخدام المشتركة، يمكنك التفكير في توفير SaveDataAsync
طريقة:
class CustomClass {
public void SaveDataAsync(string path) {
ThreadPool.QueueUserWorkItem(state => this.SaveData(path));
}
public void SaveData(string path) {
...
}
}