Как я могу использовать параллельное программирование для вызова более чем одной функции одновременно с помощью Parallel Invoke? - PullRequest
1 голос
/ 30 августа 2011

У меня есть такое приложение WPF.

namespace WpfApplication1
{
 /// <summary>
/// Interaction logic for MainWindow.xaml
 /// </summary>
 public partial class MainWindow : Window
 {
public delegate void NextPrimeDelegate();
int i = 0;

public MainWindow()
{
  InitializeComponent();
}

 public void CheckNextNumber()
{
  i++;
  textBox1.Text= i.ToString();
    Dispatcher.BeginInvoke(
      System.Windows.Threading.DispatcherPriority.SystemIdle,
      new NextPrimeDelegate(this.CheckNextNumber));

 }

private void button1_Click(object sender, RoutedEventArgs e)
{
  Dispatcher.BeginInvoke(
      DispatcherPriority.Normal,
      new NextPrimeDelegate(CheckNextNumber));
  }
 }

Вышеупомянутый код работает без проблем. Мой вопрос: как я могу использовать параллельное программирование для одновременного вызова более чем одной функции с помощью Parallel Invoke?

Например: я должен сделать что-то вроде этого.

tr[0].Start();
tr[0].Stop(); 

1 Ответ

0 голосов
/ 30 августа 2011

Я не могу связать прилагаемый пример кода с вашим вопросом, но я отвечу на ваш вопрос.Parallel.Invoke() принимает в качестве параметров лямбды (встроенные функции) (переменной длины).Он вызывает / выполняет все лямбда-выражения параллельно и блокирует выполнение до тех пор, пока не будет завершено выполнение всех лямбд.Например:

Parallel.Invoke( () => Thread.Sleep(500), () => Thread.Sleep(1500), () => Thread.Sleep(200));

Это вызвало бы все три из этих функций одновременно (() => ... - объявленная inline функция, которая не принимает параметров и возвращает результат единственного выражения, которое следует после.) И block(это означает, что выполнение не будет продолжаться после этой точки в потоке вызывающего), пока все три из этих функций не будут завершены.В этом случае Parallel.Invoke займет 1500 миллисекунд, так как самая продолжительная функция - вторая, которая ждет 1500 миллисекунд перед возвратом.

Я не совсем уверен, что вы пытаетесь проиллюстрировать с помощьюпример кода, но если вы хотите запустить Start () и Stop () параллельно (опять же, не совсем понимаете, зачем это нужно), вы можете сделать что-то вроде Parallel.Invoke(tr[0].Start(), tr[0].Stop())

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...