Вызов события нажатия кнопки из другого потока - C#

Узнай цену своей работы

Формулировка задачи:

Всем доброго времени суток)Ребят, помогите решить проблему!Суть моей программки проста, нужно прикрутить голосовое управление(оно прикручено и работает отлично), но суть проблемы встала вот в чём, есть класс Speech в нём происходят некоторые действия и по итогам распознания команды должны выполниться соответствующие действия, то есть в конце ниже приведенного кода есть метод "l[i].PerformClick()", который должен вызвать событие нажатия кнопки, параметры которой передаются через массив "l". Я проверял действия других событий в этом коде, таких как звук например, всё работает как надо, но вот с вызовом события нажатия определённой кнопки у меня затык(помогите решить пожалуйста...
using System;
using System.Collections.Generic;
using System.Data;
using System.Drawing;
using System.Linq;
using Microsoft.Speech.Recognition;
using System.Media;
using System.IO;
using System.Globalization;
using System.Threading;
using System.Windows.Forms;
namespace Project
{
    public partial class Form1 : Form
    {
         public Form1()
         {
             InitializeComponent()
             List<object>mass=new List<object>();
             for(int i=0;i<Controls.count;i++)
             {
                   mass.add(Controls[i]) ;
             }
             Speech sp = new Speech();
             sp.rech(new MyClass().izvlechenie_button(mass));
         }
         private void button6_Click(object sender, EventArgs e)
         {
               Application.Exit();
         }
    }
    class MyClass()
    {
          public List<Button> izvlechenie_button(List<object>mass)
          {
              List<Button> mass1 = new List<Button>();
              for(int i=0;i<mass.Count;i++)
              {
                  if(mass[i].GetType() == typeof(Button))
                  {
                      mass1.Add((Button)mass[i]);
                  }
              }
              return mass1;
          }
     }
     Class Speech
     { 
           static Button[] l;
           public void rech(Button[] bb)
           {
               l = bb;
               string[] mass = new string[bb.Length];
               for (int i = 0; i < mass.Length; i++)
               {
                   mass[i] = bb[i].Text;
               }
               CultureInfo ci = new CultureInfo("ru-ru");
               SpeechRecognitionEngine sre = new SpeechRecognitionEngine(ci);
               sre.SetInputToDefaultAudioDevice();
               sre.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(sre_spichrecoding);
               Choices numbers = new Choices();
               numbers.Add(mass);
               GrammarBuilder gb = new GrammarBuilder();
               gb.Culture = ci;
               gb.Append(numbers);
               Grammar g = new Grammar(gb);
               sre.LoadGrammar(g);
               sre.RecognizeAsync(RecognizeMode.Multiple);
           }
           static void sre_spichrecoding(object sender, SpeechRecognizedEventArgs e)
           {
               if (e.Result.Confidence > 0.7)
               {
                   for(int i=0;i<l.Length;i++)
                   {
                       if(l[i].Text == e.Result.Text)
                       {     
                           l[i].PerformClick();//ошибка здесь
                       }
                   }
               }
            }
        }
    }
}

Решение задачи: «Вызов события нажатия кнопки из другого потока»

textual
Листинг программы
Action action = () => {
for(int i=0;i<l.Length;i++)
{
if(l[i].Text == e.Result.Text)
{
l[i].PerformClick();//ошибка здесь
}
};
Invoke(action);

Оцени полезность:

13   голосов , оценка 3.615 из 5
Похожие ответы