2016-02-29 5 views
2

Мне нужно обрабатывать записи, доступные в таблице, параллельно, используя многопоточность. Я использую C# и настраиваю .NET 2.0.Обработка записей параллельно в .NET 2.0 с использованием нескольких потоков

Я знаю, что могу использовать Parallel.ForEach в .NET 4.0 для этого, но я не уверен, как его достичь с помощью .NET 2.0.

+0

Так как задачи не доступны ни в .NET 2, вам придется отказаться от потоков, чтобы получить то, что вы хотите, вы можете прочитать о пространстве имен System.Threading: https://msdn.microsoft .com/en-us/library/system.threading (v = vs.80) .aspx – Sidewinder94

+1

это может помочь http://stackoverflow.com/questions/523194/parallel-iteration-in-c – Olivarsham

+0

@Olivarsham nice find, в сочетании с потоками, OP может получить то, что он хочет – Sidewinder94

ответ

0

Без каких-либо других требований, многопоточность может быть реализована путем определения функции

static void Function() 
{ 
    // do some work here 
} 

, который затем используется в качестве точки входа для другого потока с помощью

Thread iThread = new Thread(Function); 

и

iThread.Start(); 

- это неблокирующий вызов, начинающийся с другого потока.

+0

@ codor- Что делать, если я хочу вызвать функцию с параметром? –

+0

Насколько я понимаю, прохождение параметров в виде аграментов невозможно; вам нужно будет использовать статические поля для передачи и возврата информации. – Codor

0

Вам необходимо зарегистрироваться Parallel.Foreach с помощью ThreadPool и ManualResetEvent.

public class Parallel 
{ 
    public static void ForEach<T>(IEnumerable<T> items, Action<T> action) 
    { 
     var resetEvents = new List<ManualResetEvent>(); 

     foreach (var item in items) 
     { 
      var evt = new ManualResetEvent(false); 
      ThreadPool.QueueUserWorkItem((i) => 
      { 
       action((T)i); 
       evt.Set(); 
      }, item); 
      resetEvents.Add(evt); 
     } 

     foreach (var re in resetEvents) 
      re.WaitOne(); 
    } 
} 

Вот example

+0

Используйте 'WaitHandle.WaitAll' вместо' WaitOne' в цикле, чтобы избежать ненужных пробуждений. –

0

До .Net 4.0 рекомендуемый способ для достижения параллельности является «ThreadPool», если у вас есть специальный случай использования.

Например, если вам нужен поток «Foreground Thread» или STA, вы напрямую используете класс Thread. В противном случае всегда отвечает ThreadPool.

Вы потребляете ThreadPool путем вызова метода ThreadPool.QueueUserWorkItem.

Однако QueueUserWorkItem не дает возможности дождаться завершения. Если вы хотите дождаться завершения, вы можете использовать Delegate.BeginInvoke, который возвращает IAsyncResult (приблизительный эквивалент задачи перед .Net 4.0), что позволяет подождать завершения и многое другое.

0

Вот пример моего answer to an earlier question, в котором показано, как запускать потоки и управлять тем, сколько из них выполняется за один раз. Это должно дать вам основу для начала.