أفضل طريقة لتشغيل وظيفة بسيطة على الموضوع جديد؟
-
05-07-2019 - |
سؤال
ولقد اثنين من الوظائف التي أريد أن تعمل على المواضيع المختلفة (لأنهم الاشياء قاعدة البيانات، وانهم لا حاجة على الفور).
وظائف هي:
getTenantReciept_UnitTableAdapter1.Fill(rentalEaseDataSet1.GetTenantReciept_Unit);
getTenantReciept_TenantNameTableAdapter1.Fill(rentalEaseDataSet1.GetTenantReciept_TenantName);
في جافا سكريبت، وأنا أعلم أنني يمكن أن تخلق خلق وظيفة مجهولة المصدر والذي يطلق عليه في موضوع جديد بسهولة تامة مع شيء من هذا القبيل:
setTimeout(new function(){doSomethingImportantInBackground();}, 500);
هل هناك شيء من هذا القبيل في C #؟
المحلول
وسؤالك ليس واضحا جدا، وأنا خائف. يمكنك بسهولة بدء موضوع جديد مع بعض الرموز، وذلك باستخدام وسائل مجهولة في C # 2، وتعبيرات لامدا في C # 3:
وطريقة مجهول:
new Thread(delegate() {
getTenantReciept_UnitTableAdapter1.Fill(
rentalEaseDataSet1.GetTenantReciept_Unit);
}).Start();
new Thread(delegate() {
getTenantReciept_TenantNameTableAdapter1.Fill(
rentalEaseDataSet1.GetTenantReciept_TenantName);
}).Start();
وامدا التعبير:
new Thread(() =>
getTenantReciept_UnitTableAdapter1.Fill(
rentalEaseDataSet1.GetTenantReciept_Unit)
).Start();
new Thread(() =>
getTenantReciept_TenantNameTableAdapter1.Fill(
rentalEaseDataSet1.GetTenantReciept_TenantName)
).Start();
ويمكنك استخدام نفس النوع من بناء الجملة من أجل Control.Invoke
، لكنها اصعب قليلا كما يمكن أن تأخذ <م> أي مندوب م> - لذلك كنت بحاجة لنقول للمترجم أي نوع كنت تستخدم بدلا من الاعتماد على التحويل الضمني. من المحتمل أن يكون أسهل في الكتابة:
EventHandler eh = delegate
{
// Code
};
control.Invoke(eh);
أو
EventHandler eh = (sender, args) =>
{
// Code
};
control.Invoke(eh);
وكملاحظة جانبية، هي أسمائكم حقا كل هذا الوقت؟ يمكنك تقصير منهم للحصول على رمز أكثر قابلية للقراءة؟
نصائح أخرى
وعلى غرار ما قيل - أجد المهام لتكون أكثر بساطة قليلا (بدعم اعتبارا من <لأ href = "https://msdn.microsoft.com/en-us/library/system.threading.tasks.task" > صافي 4 ، ويمكن استخدامها على النحو التالي اعتبارا من <لأ href = "https://msdn.microsoft.com/en-us/library/system.threading.tasks.task(v=vs.100 ) "> صافي 4.5 ):.
Task mytask = Task.Run(() =>
{
//Lines of code
});
وابتداء من المواضيع غير مكلفة نسبيا.
وأنت قد يكون من الأفضل استخدام خيط من التجمع موضوع:
ThreadPool.QueueUserWorkItem(unused =>
getTenantReciept_UnitTableAdapter1.Fill(
rentalEaseDataSet1.GetTenantReciept_Unit)
);
ThreadPool.QueueUserWorkItem(unused =>
getTenantReciept_TenantNameTableAdapter1.Fill(
rentalEaseDataSet1.GetTenantReciept_TenantName)
);
هل يمكن استخدام أسلوب مجهول:
void Foo()
{
Thread myThread = new System.Threading.Thread(delegate(){
//Your code here
});
myThread.Start();
}