Подтвердить что ты не робот

Лучший способ запустить простую функцию в новом потоке?

У меня есть две функции, которые я хочу запускать на разных потоках (потому что они - материал базы данных, и они не нужны немедленно).

Функции:

            getTenantReciept_UnitTableAdapter1.Fill(rentalEaseDataSet1.GetTenantReciept_Unit);
            getTenantReciept_TenantNameTableAdapter1.Fill(rentalEaseDataSet1.GetTenantReciept_TenantName);

В javascript я знаю, что могу создать анонимную функцию и просто вызвать ее в новом потоке с помощью чего-то вроде этого:

setTimeout(new function(){doSomethingImportantInBackground();}, 500);

В С# есть что-то подобное?

4b9b3361

Ответ 1

Боюсь, что ваш вопрос не очень ясен. Вы можете легко начать новый поток с помощью некоторого кода, используя анонимные методы в С# 2 и лямбда-выражения в С# 3:

Анонимный метод:

new Thread(delegate() {
    getTenantReciept_UnitTableAdapter1.Fill(
        rentalEaseDataSet1.GetTenantReciept_Unit);
}).Start();
new Thread(delegate() {
    getTenantReciept_TenantNameTableAdapter1.Fill(
        rentalEaseDataSet1.GetTenantReciept_TenantName);
}).Start();

Lambda выражение:

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);

Как примечание, ваши имена действительно так долго? Можете ли вы сократить их, чтобы получить более читаемый код?

Ответ 2

Подобно тому, что было сказано - я нахожу задачи немного проще (поддерживается .net 4 и может использоваться следующим образом как .NET 4.5):

Task mytask = Task.Run(() => 
{
    //Lines of code
});

Ответ 3

Начальные потоки относительно дороги.

Возможно, вам лучше использовать поток из пула потоков:

ThreadPool.QueueUserWorkItem(unused =>
    getTenantReciept_UnitTableAdapter1.Fill(
        rentalEaseDataSet1.GetTenantReciept_Unit)
);
ThreadPool.QueueUserWorkItem(unused =>
    getTenantReciept_TenantNameTableAdapter1.Fill(
        rentalEaseDataSet1.GetTenantReciept_TenantName)
);

Ответ 4

Вы можете использовать анонимный метод:


void Foo()
{
    Thread myThread = new System.Threading.Thread(delegate(){
              //Your code here
     });
    myThread.Start();
}