Я создаю приложение 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
.