Лучший способ запустить простую функцию в новом потоке?
-
05-07-2019 - |
Вопрос
У меня есть две функции, которые я хочу запускать в разных потоках (потому что они относятся к базе данных и не нужны сразу).
Функции:
getTenantReciept_UnitTableAdapter1.Fill(rentalEaseDataSet1.GetTenantReciept_Unit);
getTenantReciept_TenantNameTableAdapter1.Fill(rentalEaseDataSet1.GetTenantReciept_TenantName);
Я знаю, что в javascript я могу создать анонимную функцию и довольно легко вызвать ее в новом потоке, используя что-то вроде этого:
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);
Кстати, ваши имена действительно такие длинные?Можете ли вы сократить их, чтобы получить более читаемый код?
Другие советы
Запуск темы относительно дорог.
Возможно, вам лучше использовать поток из пула потоков:
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();
}