Страницы

среда, 13 мая 2015 г.

C# Cross-thread operations & Invoke((MethodInvoker)delegate () - делегат

MethodInvoker - делегат представляет солобой делегата, который может выполнить любой метод в управляемом коде, объявляемый с пустым списком параметров и не принимающий параметры. Этот делегат можно использовать при вызовах метода Invoke элемента управления или когда требуется простой делегат, но определять его не требуется. В следующем примере кода демонстрируется использование объекта MethodInvoker для вызова метода, обновляющего заголовок окна формы приложений и двух разных форм. Обращение из потока к форме невозможно напрямую , для этого правильнее всего использовать eventы, но если очень хочется и не слишком часто то можно например так

ЯИМЯКОНТРОЛА.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) { } } }

Комментариев нет:

Отправить комментарий

ваше мнение...