سؤال

ولقد قرأت وبحثت في عدد غير قليل من الأمثلة لThreadpooling ولكني يبدو غير قادر على فهمه أنها الطريقة أنا في حاجة إليها. ما كنت قد يتمكنون من الحصول على العمل ليس حقا ما أحتاج. انها مجرد يدير وظيفة في موضوع خاص بها.

public static void Main()
    {
        while (true)
        {
            try
            {
                ThreadPool.QueueUserWorkItem(new WaitCallback(Process));
                Console.WriteLine("ID has been queued for fetching");
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error: " + ex.Message);
            }
            Console.ReadLine();
        }
    }

public static void Process(object state)
{

    var s = StatsFecther("byId", "0"); //returns all player stats
    Console.WriteLine("Account: " + s.nickname);
    Console.WriteLine("ID: " + s.account_id);
    Console.ReadLine();
}

ما أحاول القيام به هو أن يكون حوالي 50 المواضيع الذهاب (ربما أكثر) أن جلب البيانات فب المتسلسلة التي تحتوي على احصائيات لاعب. بدءا من المستخدم 0 كل وسيلة تصل إلى معرف العضو i تحديد (300000). سؤالي ليس عن كيفية جلب احصائيات أعرف كيفية الحصول على احصائيات وقراءتها، ولكن كيف وأنا أكتب Threadpool من شأنها أن تبقي جلب احصائيات حتى يصل إلى 300،000th هوية المستخدم دون داس على أصابع القدم من المواضيع الأخرى، و يوفر الإحصاءات كما فإنه يسترد منها إلى قاعدة بيانات.

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

المحلول

static int _globalId = 0;
public static void Process(object state)
{    
  // each queued Process call gets its own player ID to fetch
  processId = InterlockedIncrement(ref _globalId); 
  var s = StatsFecther("byId", processId); //returns all player stats 

  Console.WriteLine("Account: " + s.nickname);    
  Console.WriteLine("ID: " + s.account_id);    
  Console.ReadLine();
}

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

أولا يجب استخدام الأساليب المتزامن من WebRequest: <لأ href = "http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.begingetrequeststream.aspx" يختلط = "نوفولو noreferrer "> BeginGetRequestStream (وإذا كنت وظيفة ويكون الجسم الطلب) و / أو <وأ href =" http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.begingetresponse.aspx "يختلط =" noreferrer نوفولو "> BeginGetResponse . هذه الأساليب مقياس أفضل بكثير وستحصل على troughput أعلى للأقل وحدة المعالجة المركزية (إذا النهاية الخلفية يمكن مجاراتها بطبيعة الحال).

وثانيا يجب عليك أن تنظر throthling الذاتي. على مشروع مماثل كنت معلقة طلب العد. على النجاح، فإن كل دعوة تقديم 2 المزيد من المكالمات، وتوج مع عدد throtling. على الامتناع من شأنه أن الدعوة لم تقدم أي شيء. إذا لم يكن هناك دعوات معلقة، تقدم إعادة محاولة مؤقت على أساس دعوة جديدة كل دقيقة. بهذه الطريقة حاولت مرة واحدة فقط للدقيقة الواحدة عند الخدمة باستمرار، وتوفير الموارد الخاصة بك من الغزل ث / س الجر، ويمكنك زيادة سرعة نقل ما يصل الى الحد الأقصى throtling عندما تكون الخدمة قد انتهت.

ويجب أن نعرف أيضا أن الإطار صافي ستحد من عدد من conncetions concurent يجعل إلى أي مورد. يجب أن تجد وجهتك ServicePoint و التغيير و ConnectionLimit من قيمته الافتراضية (2 ) إلى قيمة الحد الأقصى كنت على استعداد لخنق جرا.

وعن جزء تحديث قاعدة البيانات، وهناك وسيلة لكثير من المتغيرات في اللعب والمعلومات بطريقة القليل جدا لإعطاء أي نصيحة meaningfull. سيكون هناك بعض النصائح العامة أن أساليب غير متزامن استخدامها في استدعاء قاعدة بيانات أيضا، حجم تجمع conneciton أحرقت للسماح لغطاء throtling الخاص بك، تأكد من التحديثات الخاصة بك استخدام معرف لاعب كمفتاح لذلك لم يكن طريق مسدود على تحديث نفس السجل من المواضيع المختلفة .

نصائح أخرى

وكيف تحدد هوية المستخدم؟ خيار واحد هو جزء جميع المواضيع بحيث موضوع X يتعامل مع معرف من 0 - N، وهلم جرا، وجزء بسيط من كم المواضيع ديك

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