jinesh sam Ответов: 0

Значение индикатора выполнения и текст не обновляются должным образом


Привет Друзья,

У меня есть индикатор выполнения и метка, указывающая на ход выполнения. но значение прогресса и текст метки печатаются не так, как ожидалось. В каждом из методов я присваиваю значение и текст статическому свойству, доступ к которому можно получить из пользовательского интерфейса.
Проблема в том, что исходный текст не отображается, и он застрял с надписью "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

0 Ответов