2013-05-24 2 views
-1

Я использую приведенный ниже код для вызова метода из функции thread.It не работает. Пожалуйста, помогите мне сделать это.Вызвать функцию из темы

DataTable dt = get_data(Convert.ToInt32(Start_From), Convert.ToInt32(End_To)); 
foreach (DataRow dr in dt.Rows) 
{ 
    ThreadStart newThread = new ThreadStart(delegate { insert_Data(dr); }); 
    Thread myThread = new Thread(newThread); 
} 

public static DataTable get_Data(int form,int to) 
{ 
    ..... 
    return Dt; 
} 

[MTAThread] 
public static string insert_Data(DataRow dr) 
{ 
.....SOme code here //This funcion not call 
} 
+0

Рассмотрим с помощью 'Queue' для передачи данных в пуле потоков. Ваш код запустит поток для каждой строки, который очень неэффективен. – Romoku

+0

Я новый для этой концепции. Дайте мне некоторую идею. – user2176150

ответ

1

Нужно также запустить эту тему, вызвав myThread.Start();

foreach (DataRow dr in dt.Rows) 
{ 
    DataRow dataRow = dr; 
    ThreadStart newThread = new ThreadStart(delegate { insert_Data(dataRow); }); 
    Thread myThread = new Thread(newThread); 
    myThread.Start(); 
} 

Когда поток построен, он изначально не работает; вам нужно сделать это явно, используя метод Thread.Start. Это дает вам немного больше контроля, когда поток начинает выполнение.

Редактировать: исправлено для использования закрытого значения.

+0

работает очень медленно. – user2176150

+0

Не получится. Значения, закрытые внутри делегата, вызовут проблемы. –

+0

Что работает очень медленно? Как медленно? Во всяком случае, медлительность не имеет ничего общего с вопросом, который вы задали первоначально. Возможно, вам придется опубликовать другой вопрос, если у вас есть проблемы с производительностью. – Polyfun

2

Вы сделали две ошибки: - Вы забыли начать тему (как сказано в любом ответе) - Вы используете закрытое значение. Это плохое поведение, потому что функция потока получит неправильную строку. См: http://blogs.msdn.com/b/ericlippert/archive/2009/11/12/closing-over-the-loop-variable-considered-harmful.aspx

Попробуйте это:

foreach (DataRow dr in dt.Rows) 
{ 
    DataRow localRow = dr; 
    ThreadStart newThread = new ThreadStart(delegate { insert_Data(localRow); }); 
    Thread myThread = new Thread(newThread); 
    myThread.Start(); 
} 

Для создания потока для небольшой операции не Рекоммендуемый. Попробуйте использовать ThreadPool, для выполнения:

foreach (DataRow dr in dt.Rows) 
{ 
    Action<DataRow> action = (row) => insert_Data(row); 
    action.BeginInvoke(dr, null, null); 
} 

Другое решение это использовать PLINQ:

Parallel.ForEach(dt.AsEnumerable(), dr => insert_Data(dr)); 
0

1: Почему вы хотите, чтобы запустить поток для каждой строки данных вы найдете?
2: Для того, чтобы начать нить в вашем коде, вам нужно добавить следующую строку кода

.... 
.... 
ThreadStart newThread = new ThreadStart(delegate { get_Data(dr); }); 
Thread myThread = new Thread(newThread); 
myThread.Start(); 
Смежные вопросы