Событие не запускается все время из потока в основной поток - PullRequest
0 голосов
/ 28 февраля 2020

В настоящее время я экспериментирую с кодом 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% в конце выполнения. Это показывает, что событие явно стреляет, но не всегда. Могу ли я что-нибудь добавить в этот код, чтобы сделать это возможным?

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