.NET 4.x Не срабатывает делегат и метод Invoke - C#

Узнай цену своей работы

Формулировка задачи:

Добрый день всем. Товарищи такая беда, сообразить не могу поэтому прошу вашей помощи. Есть метод в котором выполняется поток
public decimal privat; 
 
public void Working() // название метода
 
        {
 
 while (work)  // пока идет работа
    {
        lock (this)
        try
        {
           Invoke(new EventHandler(delegate
            {
                privat = (Convert.ToDecimal(label7.Text) / progressBar1.Maximum);  // считывает соотношение необходимых мне строк к общему количеству строк загруженных строк из текстового файла.
                label50.Text = string.Format("{0:0.0%}", privat); // выдает мне эту информацию в виде текста на label50.
            }));
     Invoke(new EventHandler(delegate
       {
         conv = (decimal)progressBar1.Value/progressBar1.Maximum; // Тут процент выполненной работы 
        label46.Text = Convert.ToInt32(conv*100)+@" %";})); // отображает процент выполненной работы на label46
           Invoke(new EventHandler(delegate { progressBar1.Increment(+1); })); // увеличивает значение прогрессбара на 1
}

 private void Start_Click(object sender, EventArgs e) // По нажатию на кнопку старт запускаются потоки.
        {
                work = true;
                manager = new JobManager(Working);  // это из библиотеки Viking.Engine создает поток
                manager.PreferredThreadCount = (int) threadbox.Value;
                manager.JobCompleted += (obj, args) => MessageBox.Show(args.Reason + @"");
                manager.Start();
}
А суть вот в чём у меня всё налеплено в Form1.cs. Есть в программе 3 tabcontrol элемента и всё их содержимое одинаковое и код одинаковый, но поскольку я не умею пока составлять правильную структуру программы то тупо просто беру делаю копипаст методов и изменяю там параметры необходимые и имена элементов.
//То есть для одной как бы программы у меня метод
public void Working()
//для второй
public void Working2()
{
//и тут код такой же как и в Working
}
И беда в том, что метод Invoke в методе Working работает всё проценты показывает, процент выполненной работы показывает всё в общем работает. Но при этом в методе Working2, если скопипастить вот этот код ничего работать не будет, но если я запущу из первого controltab'а программу то есть метод Working то мне в третьем controltab'е начинает отображать информацию из первого, то есть каким то образом Invoke(new EventHandler(delegate привязывается в любом случае к методу Working. Хоть я 10 раз скопирую и переименую этот метод всё равно делегат работать не будет пока я не запущу первую программу с методом Working. Хотя имя потока я изменил на другое и имя метода тоже. И вот я не могу понять почему оно именно привязывается к самому первому методу и потоку созданному там.
   Invoke(new EventHandler(delegate
            {
                privat = (Convert.ToDecimal(label7.Text) / progressBar1.Maximum);  // считывает соотношение необходимых мне строк к общему количеству строк загруженных строк из текстового файла.
                label50.Text = string.Format("{0:0.0%}", privat); // выдает мне эту информацию в виде текста на label50.
            }));
     Invoke(new EventHandler(delegate
       {
         conv = (decimal)progressBar1.Value/progressBar1.Maximum; // Тут процент выполненной работы 
        label46.Text = Convert.ToInt32(conv*100)+@" %";})); // отображает процент выполненной работы на label46
           Invoke(new EventHandler(delegate { progressBar1.Increment(+1); })); // увеличивает значение прогрессбара на 1
Или может кто подскажет как сделать проценты на прогрессбаре ?

Решение задачи: «.NET 4.x Не срабатывает делегат и метод Invoke»

textual
Листинг программы
using System;
using System.Drawing;
using System.Windows.Forms;
 
namespace ProgressBarTest
{
    class ProgressBarDetailed : ProgressBar
    {
        public enum Mode
        {
            Percentage,
            CustomText
        }
 
        public Mode DisplayMode { get; set; }
        public string CustomText { get; set; }
 
        public ProgressBarDetailed()
        {
            // Modify the ControlStyles flags
            //http://msdn.microsoft.com/en-us/library/system.windows.forms.controlstyles.aspx
            SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint, true);
        }
 
        protected override void OnPaint(PaintEventArgs e)
        {
            ProgressBarRenderer.DrawHorizontalBar(e.Graphics, ClientRectangle);
            ClientRectangle.Inflate(-3, -3);
            double progress = ((double)(Value - Minimum) / (Maximum - Minimum));
            if (Value > 0)
            {
                Rectangle clip = new Rectangle(ClientRectangle.X, ClientRectangle.Y, (int) Math.Round(ClientRectangle.Width * progress), ClientRectangle.Height);
                ProgressBarRenderer.DrawHorizontalChunks(e.Graphics, clip);
            }
            string text = DisplayMode == Mode.Percentage ? progress.ToString("P") : CustomText;
            using (Font f = new Font(FontFamily.GenericSerif, 10))
            {
                SizeF len = e.Graphics.MeasureString(text, f);
                PointF location = new PointF((float) Math.Round(Width/2.0 - len.Width/2.0), (float) Math.Round(Height/2.0 - len.Height/2));
                e.Graphics.DrawString(text, f, Brushes.Red, location);
            }
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4 из 5
Похожие ответы