Как получить результаты в режиме реального времени от UserControl? - PullRequest
0 голосов
/ 19 декабря 2018

Я создаю приложение Windows Forms, в котором я создал UserControl (называется MyControl).

Этот UserControl может генерировать и возвращать значение, используя BackgroundWorker.

Мой вопрос: как мой form1 может в реальном времени отображать значение, созданное UserControl после завершения расчета?

public partial class MyControl : UserControl
{
    BackgroundWorker bgWorker;
    private string _num;

        public string Num
        {
            get
            {
                return _num;
            }
            set
            {
                _num = value;
            }
        }

        public MyControl()
        {
            InitializeComponent();

            bgWorker = new BackgroundWorker();
            bgWorker.DoWork += new DoWorkEventHandler(bgWorker_DoWork);
            bgWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgWorker_RunWorkerCompleted);
        }

        void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            this.BeginInvoke((MethodInvoker)delegate
            {
                //Done
                MessageBox.Show(e.Result.ToString());
                //↑↑↑↑↑ HERE
                //I want to return to form1
                // like to rewrite: form1.textbox1.text = e.Result.ToString();
            });

            btnStartAsyncOperation.Enabled = true;
            btnCancel.Enabled = false;
        }

        void bgWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            string Num = A_huge_calculation();
            e.Result = Num;
        }

        private void RunCalculate(string Num)
        {
            if (bgWorker.IsBusy != true)
            {
                bgWorker.RunWorkerAsync(Num);
            }
        }

        private void btnStartAsyncOperation_Click(object sender, EventArgs e)
        {
            RunCalculate(_num);

        }
    }
}

Зачем использовать BackgroundWorker?Потому что это будет делать непредсказуемую вещь (например, генерировать контрольную сумму MD5 и SHA1 для любого файла), и я не хочу, чтобы основная форма засыпала для конечного пользователя.

Помимо form2 будет добавлен этот UserControl, как form1,и назначить уникальный элемент управления для отображения значения.

form2.cs

public partial class Form2 : Form
{
    MyControl mycontrol;
    private void Form2_Load(object sender, EventArgs e)
    {
        mycontrol.SentTO = 'richtextBox1';
        //It can be assign any container name to receive the value when completed.
        //when trigger the execute button inside the MyControl
    }
    private void button1_Click(object sender, EventArgs e)
    {
        mycontrol = new MyControl();
        mycontrol.Num = "xxxxxx";

        //run mycontrol
        //mycontrol.run();

        richtextBox2.Text = mycontrol.value; //Here, when the MyControl calculation is completed.

    }
}

Я также думал установить таймер прослушивания этого пользовательского элемента управления, получающего значение каждые 1000 мс.

form1.cs

    private void timer1_Tick(object sender, EventArgs e)
    {
        if( ! string.IsNullOrEmpty(mycontrol.value))
        {
            richtextBox2.Text = mycontrol.value; //here is when the MyControl calculation is completed.
            timer1.Stop();
        }
    }

Старый идеал состоял в том, чтобы получить доступ к общедоступному значению MyControl с помощью timer, когда MyControl завершено, он вернет ненулевое значение, иtimer Стоп MyControl Обнаружение.Но это будет производным, почему MyControl может знать, как называется timer в form1?Или form1, устанавливаемый два или более MyControls, требуется больше timers для обнаружения каждого MyControl.

...