سؤال
وأنا أعمل على برنامج ويندوز. أنا بحاجة لمحاكاة الدورة (أن لدينا في تطبيق ويب) في تطبيق الفوز حيث إذا كان المستخدم غير نشط لفترة معينة، وقال انه يحصل على تسجيل الخروج. يتم الحفاظ على حالة تسجيل الدخول المستخدم في قاعدة البيانات.
وأي أفكار مبتكرة ؟؟؟
المحلول
وأنت لست بحاجة الدورة (أو CallContext، أو أي شيء آخر)، مجرد سينغلتون و> "مخزن المستخدم" مع تقييد واحد:
وبعد تسجيل المستخدم أو أظهر بعض النشاط، لديك لانقاذ التاريخ / الوقت على ذلك. في المرة القادمة، عندما يريد المستخدم القيام بشيء ما، فقط مقارنة (lastactivity + logouttime) إلى التاريخ / الوقت الفعلي.
والخطوط العريضة للعملية يمكن أن يكون:
[User login]
|
!
[User 'store' saves user date + login time]
[This is a singleton ]
...
[Next time user wants to do something. The ]
[program asks user data from the user 'store']
|
!
[If the actual time is greater than user ]
[lastactivity + LOGOUTTIME, user cannot do it]
[If not, then update last activity ]
وUserStore يمكن تنفيذها باعتبارها <م> قاموس م> واستخدامها على النحو التالي:
// Log in
Singleton.UserStore.Add("John", new UserData( yourUserObject, DateTime.Now));
...
// Check (ie. in a property-get)
var userData = Singleton.UserStore["John"];
if (userData.LastActivityDate + _LOGOUTIME > DateTime.Now())
{
throw UserAutomaticallyLoggedOut();
}
else
{
userData.LastActivityDate = DateTime.Now();
}
نصائح أخرى
ما يتبادر إلى الذهن هو استخدام BackgroundWorker لتسجيل الخروج للمستخدم عندما يصل الموقت صفر. تتم إعادة تعيين جهاز ضبط الوقت في كل عمل يجعل المستخدم. أو يمكن حتى أن يكون مدمن مخدرات إلى الماوس أو لوحة المفاتيح الأحداث بحيث عندما يقوم المستخدم لا تحريك الماوس أو لم يتم استخدام لوحة المفاتيح الموقت العد التنازلي حتى تصل إلى تسجيل الخروج الساعة.
هل يمكن إنشاء فئة في التطبيق الخاص بك لديه نوعا من المهلة التي تتم إعادة تعيين كل مرة يتفاعل المستخدم مع البرنامج. إذا تم الوصول إلى المهلة، يتم تسجيل خروج المستخدم.
وهذا شيء صعب هنا هو الكشف عن التفاعل مع المستخدم. في ASP.NET من السهل جدا، وتحتاج أساسا للتحقق فقط لطلبات الصفحة. في تطبيق أشكال النوافذ سوف تحتاج إلى إدخال montor على مستوى أكثر تفصيلا (أي اضغط على مفتاح في أي مربع النص سوف يكون تفاعل المستخدم على سبيل المثال). أعتقد أن الخاصية KeyPreview جنبا إلى جنب مع المستمع الحدث KeyPress على النموذج قد يكون وسيلة جيدة إلى الأمام.
حسنا، أولا، ماذا تقصد غير نشط؟ على شبكة الإنترنت التي تحاول محاكاة دولة حيث هناك لا شيء. ومع ذلك، في التطبيق العميل، يمكنك الحصول على جميع أنواع الأحداث حتى MouseMove. فكرة ONDE هي أنك يمكن أن تخلق UserControls من الضوابط المدخلات القياسية مثل مربع نص، زر، وهكذا دواليك، ويكون لهم تحديث نوعا من كائن مؤقت عندما يتم استدعاء الأحداث. والآخر هو التخلي عن الاشياء UserControl ومجرد استكمال توقيت في كل معالج الأحداث التي تقوم بإنشائها. ربما سيكون من الأسهل مجرد استكمال توقيت استنادا إلى أحداث MouseMove أو KeyDown على نموذج نفسها.