.NET 4.x Не срабатывает делегат и метод Invoke - C#
Формулировка задачи:
Добрый день всем. Товарищи такая беда, сообразить не могу поэтому прошу вашей помощи.
Есть метод в котором выполняется поток
А суть вот в чём у меня всё налеплено в Form1.cs. Есть в программе 3 tabcontrol элемента и всё их содержимое одинаковое и код одинаковый, но поскольку я не умею пока составлять правильную структуру программы то тупо просто беру делаю копипаст методов и изменяю там параметры необходимые и имена элементов.
И беда в том, что метод Invoke в методе Working работает всё проценты показывает, процент выполненной работы показывает всё в общем работает. Но при этом в методе Working2, если скопипастить вот этот код ничего работать не будет, но если я запущу из первого controltab'а программу то есть метод Working то мне в третьем controltab'е начинает отображать информацию из первого, то есть каким то образом Invoke(new EventHandler(delegate привязывается в любом случае к методу Working. Хоть я 10 раз скопирую и переименую этот метод всё равно делегат работать не будет пока я не запущу первую программу с методом Working. Хотя имя потока я изменил на другое и имя метода тоже. И вот я не могу понять почему оно именно привязывается к самому первому методу и потоку созданному там.
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(); }
//То есть для одной как бы программы у меня метод public void Working() //для второй public void Working2() { //и тут код такой же как и в 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); } } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д