В настоящее время я экспериментирую с кодом c# для выполнения межпотокового обмена данными от случайного потока к основному потоку.
Вот мой код:
using System;
using System.Drawing;
using System.Threading;
using System.Windows.Forms;
public delegate void MyHandler<MyEventArgs>(object sender, MyEventArgs e);
public class thr : Form
{
Button b1;
ProgressBar pb;
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.Run(new thr());
}
public thr()
{
b1 = new Button();
b1.Text = "Open";
pb = new ProgressBar();
pb.Location = new Point(pb.Location.X, b1.Location.Y + b1.Size.Height + 5);
pb.Step = 1;
pb.Style = ProgressBarStyle.Continuous;
this.Controls.Add(b1);
this.Controls.Add(pb);
b1.Click += (s, e) => { this.M_work(); };
}
private void M_work()
{
dhr obb = new dhr();
obb.Ev1 += (s, e) => { pb.Value = e.PbVal; };
ThreadStart tst = new ThreadStart(obb.prform);
Thread thh = new Thread(tst);
thh.Start();
this.Text = obb.Txtt;
}
}
class dhr
{
public string Txtt;
public event MyHandler<MyEventArgs> Ev1;
public void prform()
{
int ab = 1;
int cd = Int32.MaxValue - 3;
int ef = 1;
while(ef != cd)
{
if(ab % 2 == 0)
{
ab = 0;
ef++;
}
ab++;
if(this.Ev1 != null)
this.Ev1.Invoke(this, new MyEventArgs( (ef/cd) * 100 ) );
}
this.Txtt = ef.ToString();
}
}
public class MyEventArgs : EventArgs
{
public int PbVal;
public MyEventArgs(int pbval)
{
this.PbVal = pbval;
}
}
Однако я немного знаю о BackgroundWorker и мог бы использоваться в этом коде, но у меня появилась надежда на это, когда индикатор выполнения обновляется до 100% в конце выполнения. Это показывает, что событие явно стреляет, но не всегда. Могу ли я что-нибудь добавить в этот код, чтобы сделать это возможным?