Значение индикатора выполнения и текст не обновляются должным образом
Привет Друзья,
У меня есть индикатор выполнения и метка, указывающая на ход выполнения. но значение прогресса и текст метки печатаются не так, как ожидалось. В каждом из методов я присваиваю значение и текст статическому свойству, доступ к которому можно получить из пользовательского интерфейса.
Проблема в том, что исходный текст не отображается, и он застрял с надписью "Post Expense completed". Пожалуйста, помогите мне последовательно отобразить сообщение метки и индикатор выполнения.
Основной метод, вызывающий из пользовательского интерфейса
public class MainMethod { public static void PostData(DataSet ds, PostBasicInput pbi) { Task t1 = Task.Factory.StartNew(() => TaskClass.PostBasicPlan(ds, pbi)).ContinueWith((prevtask) => TaskClass.PostMembers(ds, pbi)); Task.WaitAny(t1); Task.Factory.StartNew(() => TaskClass.PostIncome(ds, pbi)); Task.Factory.StartNew(() => TaskClass.PostExpense(ds, pbi)); } }
public class TaskClass { public static void PostBasicPlan(DataSet ds, PostBasicInput pbi) { TestSettings.progresstext = "Post basic started"; TestSettings.progressvalue = 10; Thread.Sleep(2000); TestSettings.progresstext = "Post basic completed"; TestSettings.progressvalue = 20; } public static void PostMembers(DataSet ds, PostBasicInput pbi) { TestSettings.progresstext = "Post Member started"; TestSettings.progressvalue = 30; Thread.Sleep(2000); TestSettings.progresstext = "Post Member completed"; TestSettings.progressvalue = 40; } public static void PostIncome(DataSet ds, PostBasicInput pbi) { TestSettings.progresstext = "Post income started"; TestSettings.progressvalue = 50; Thread.Sleep(2000); TestSettings.progresstext = "Post income completed"; TestSettings.progressvalue = 60; } public static void PostExpense(DataSet ds, PostBasicInput pbi) { TestSettings.progresstext = "Post expense started"; TestSettings.progressvalue = 70; Thread.Sleep(2000); TestSettings.progresstext = "Post expense completed"; TestSettings.progressvalue = 80; } public static void PopulateExcel(String excelpath) { TestSettings.progresstext = "Excel file creation"; Thread.Sleep(2000); TestSettings.progresstext = "Excel Generated sucessfully"; TestSettings.progressvalue = 90; } public static void Results(String apipath) { TestSettings.progresstext = "Calling result API"; Thread.Sleep(2000); TestSettings.progresstext = "Actual vs expected excel generated"; TestSettings.progressvalue = 100; } }
Дополнительные занятия
public class PostBasicInput { public string excelId { get; set; } public int planId { get; set; } public string timeverificationstamp { get; set; } } public class TestSettings { public static int progressvalue { get; set; } public static string progresstext { get; set; } }
Что я уже пробовал:
Событие нажатия кнопки
private void button1_Click(object sender, EventArgs e) { DataSet ds=new DataSet(); PostBasicInput pbi=new PostBasicInput(); timer1.Start(); Task t1= Task.Factory.StartNew(()=> MainMethod.PostData(ds, pbi)); Task t2 = Task.Factory.StartNew(() => TaskClass.PopulateExcel("xyz")); Task.WaitAll(t1, t2); TaskClass.Results("http://"); lblmsg.Text = "Completed.."; } //timer tick event private void timer1_Tick(object sender, EventArgs e) { progressBar1.Value = TestSettings.progressvalue; lblmsg.Text = TestSettings.progresstext; }
Kornfeld Eliyahu Peter
Вы пытаетесь обновить пользовательский интерфейс из другого потока?
jinesh sam
да его отдельная нить
Kornfeld Eliyahu Peter
Это твоя проблема! Есть некоторые проблемы, связанные с тем, что называется "потокобезопасностью"...
Есть много статей, Если вы правильно ищете в Google...
Вы можете начать здесь: https://msdn.microsoft.com/en-us/windows/uwp/debug-test-perf/keep-the-ui-thread-responsive
RickZeeland
Я бы тоже сделал класс TestSettings статичным.
Также я бы использовал progressBar1.InvokeRequired в timer1_Tick ().
См.: https://msdn.microsoft.com/en-us/library/ms171728(v=против 110). aspx