Вызов события нажатия кнопки из другого потока - 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);