Делегаты: информировать операции на верхнем уровне - PullRequest
0 голосов
/ 31 декабря 2010

Этот вопрос относится к c #. Сценарий состоит в том, что когда я нажимаю кнопку, происходят такие операции, как чтение файла, манипулирование данными и сброс файла. После завершения каждой операции я буду обновлять статус (т.е. , Чтение файла завершено, обработка данных завершена) в метке, которая находится в пользовательском интерфейсе (FORM-frmTesting)

Событие нажатия кнопки

namespace frmTesting
{
    public partial class Form1 : Form
    {
        private void button1_Click_1(object sender, EventArgs e)
        {
            class1 l_objClass1 = new class1();
            l_objClass1.DoOperation();
        }
    }

    public class class1
    {
        public int DoOperation()
        {
            ReadTextFile();
            ParsingData();
            SaveTextFile();
            return 0;
        }
        private int ReadTextFile()
        {

            //Read the text File   
            return 0;
        }
        private int ParsingData()
        {
            // Data manipulation
            return 0;
        }
        private int SaveTextFile()
        {
            // save the file   
            return 0;
        }
    }
}

Возможно ли это сделать с помощью делегатов?

Ответы [ 2 ]

1 голос
/ 31 декабря 2010
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace WindowsFormsApplication3
{
    public delegate void MyDelagate();

    class Class1
    {
        public event MyDelagate _myDelegate;
        private String s1 = String.Empty;

        public String s
        {
            get
            {
                return s1;
            }

            set
            {
                s1 = value;
                if(_myDelegate != null)
                    _myDelegate();
            }
        }
        public int DoOperation()
        {
            s = "Started";
            ReadTextFile();
            ParsingData();
            SaveTextFile();
            s = "Completed";
            return 0;
        }
        private int ReadTextFile()
        {
            s = "Read Text File";
            Thread.Sleep(3000);            
            return 0;
        }
        private int ParsingData()
        {
            s = "Parsing Data";
            Thread.Sleep(3000);
            return 0;
        }
        private int SaveTextFile()
        {
            s = "Save Text File";
            Thread.Sleep(3000);
            return 0;
        }
    }
}

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication3
{
    public partial class Form1 : Form
    {
        Class1 x = new Class1();

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            x._myDelegate += new MyDelagate(UpdateStatus);
            x.DoOperation();
        }

        void UpdateStatus()
        {
            label1.Text = x.s;
            Validate();
        }
    }
}
0 голосов
/ 31 декабря 2010

Конечно.

Вы бы настроили свой делегат на свой Class1.

После того, как вы создадите свой Class1 (или вы могли бы сделать это в своем конструкторе), вы назначаете свою функцию свойству делегата.

Когда ваши операции происходят / завершаются, они проверяют, не является ли делегат нулевым, затем выполняют делегат с любыми аргументами события, которые они хотят (уровень статуса, статус завершения, и тому подобное).

Тогда функция вашей Form1, переданная делегату, будет обрабатывать аргументы и присваивать значения текстовым полям.

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