MethodInvoker - делегат представляет солобой делегата, который может выполнить любой метод в управляемом коде, объявляемый с пустым списком параметров и не принимающий параметры. Этот делегат можно использовать при вызовах метода Invoke элемента управления или когда требуется простой делегат, но определять его не требуется. В следующем примере кода демонстрируется использование объекта MethodInvoker для вызова метода, обновляющего заголовок окна формы приложений и двух разных форм. Обращение из потока к форме невозможно напрямую , для этого правильнее всего использовать eventы, но если очень хочется и не слишком часто то можно например так
ЯИМЯКОНТРОЛА.Invoke((MethodInvoker)(delegate(){
Тут делать что угодно с ЯИМЯКОНТРОЛА
}));
BeginInvoke(new MethodInvoker(delegate
{
//здесь твой код в основном потоке
}));
ЯИМЯКОНТРОЛА.Invoke((MethodInvoker)(delegate(){
Тут делать что угодно с ЯИМЯКОНТРОЛА
}));
BeginInvoke(new MethodInvoker(delegate
{
//здесь твой код в основном потоке
}));
public partial class Form1 : Form { public Form1() { // Create a timer that will call the ShowTime method every second. var timer = new System.Threading.Timer(ShowTime, null, 0, 1000); } private void ShowTime(object x) { // Don't do anything if the form's handle hasn't been created // or the form has been disposed. if (!this.IsHandleCreated && !this.IsDisposed) return; // Invoke an anonymous method on the thread of the form. this.BeginInvoke((MethodInvoker) delegate { // Show the current time in the form's title bar.
this.Text = DateTime.Now.ToLongTimeString();
textBox1.Text = DateTime.Now.ToLongTimeString();
richTextBox1.Text = DateTime.Now.ToLongTimeString();
}); }}Ещё один пример - прием данных с АЦП. Данные приходят из порта после посылкизапроса - отправки байта "0xFF".using System; using System.Threading; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Thread newthread; public Form1() { InitializeComponent(); serialPort1.Open(); } private void func() { int iii = 10; while (true) { Invoke((MethodInvoker)delegate () { var dataArray = new byte[] { 0xFF }; serialPort1.Write(dataArray, 0, 1); Thread.Sleep(50); string res = serialPort1.ReadExisting(); textBox1.Text = ("\n" + "\r" + res); }); } } private void button1_Click(object sender, EventArgs e) { newthread = new Thread(func); newthread.Start(); } private void button2_Click(object sender, EventArgs e) { newthread.Abort(); } private void Close(object sender, FormClosingEventArgs e) { newthread.Abort(); } private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { } } }
Комментариев нет:
Отправить комментарий
ваше мнение...