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

Я обычно использую TFS SideKicks для этого.

32
задан Malfist 21 October 2009 в 20:15
поделиться

3 ответа

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

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

71
ответ дан 27 November 2019 в 19:48
поделиться

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


void Foo()
{
    Thread myThread = new System.Threading.Thread(delegate(){
              //Your code here
     });
    myThread.Start();
}
7
ответ дан 27 November 2019 в 19:48
поделиться

Запуск потоков обходится относительно дорого.

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

ThreadPool.QueueUserWorkItem(unused =>
    getTenantReciept_UnitTableAdapter1.Fill(
        rentalEaseDataSet1.GetTenantReciept_Unit)
);
ThreadPool.QueueUserWorkItem(unused =>
    getTenantReciept_TenantNameTableAdapter1.Fill(
        rentalEaseDataSet1.GetTenantReciept_TenantName)
);
10
ответ дан 27 November 2019 в 19:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: