Лучший способ запустить простую функцию в новой теме? - PullRequest
30 голосов
/ 22 октября 2009

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

Функции:

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

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

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

Есть ли что-то подобное в C #?

Ответы [ 4 ]

69 голосов
/ 22 октября 2009

Боюсь, ваш вопрос не очень понятен. Вы можете легко начать новый поток с некоторым кодом, используя анонимные методы в 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);

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

26 голосов
/ 23 марта 2014

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

Task mytask = Task.Run(() => 
{
    //Lines of code
});
10 голосов
/ 22 октября 2009

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

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

ThreadPool.QueueUserWorkItem(unused =>
    getTenantReciept_UnitTableAdapter1.Fill(
        rentalEaseDataSet1.GetTenantReciept_Unit)
);
ThreadPool.QueueUserWorkItem(unused =>
    getTenantReciept_TenantNameTableAdapter1.Fill(
        rentalEaseDataSet1.GetTenantReciept_TenantName)
);
7 голосов
/ 22 октября 2009

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


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