.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);
}
}
}
}