2010-03-08 2 views
5

Сценарий:C# Помощь с базовым педагогическим примером процесса BackgroundWorker Наполнение DataGridView

У меня есть форма окон, которая держит DataGridWiew с 3 предопределенные столбцов. У меня есть 3 переменных, объявленных вне функции и назначенных внутри функции. У меня есть функция, которая перечисляет вещи, и помещает его в 3-х столбцов, строка за строкой:

string VARIABLE1; 
string VARIABLE2; 
string VARIABLE3; 

private void FunctionEnumerateStuff() 
{ 
    foreach (StuffObject STUFF in StuffCollection) 
    { 
     VARIABLE1 = STUFF.SubStuff1.ToString(); 
     VARIABLE2 = STUFF.SubStuff2.ToString(); 
     VARIABLE3 = STUFF.SubStuff3.ToString(); 
     DatagridWiew1.Rows.Add(VALUE1, VALUE2, VALUE3); 
    } 
} 

То, что я хочу сделать, это выполнить эту функцию из BackGroundWorker процесса, так что GUI приложения будет плавным и отзывчивым. Я читал на фоновых работниках, но у меня возникают проблемы, потому что все примеры кажутся совершенно разными сценариями, и большинство из них в подавляющем большинстве сложны.

Может ли какая-нибудь полезная педагогическая душа помочь мне и другим людям с очень простым примером того, как заставить это работать самым простым способом. Спасибо.

+0

Что это то, что занимает так много времени? Зачем делать асинхронным? У вас есть десятки тысяч строк? У вас есть проблемы СЕЙЧАС с изменчивостью в пользовательском интерфейсе? Может быть, вы можете показать свой фактический код, если это так. Код, который вы покажете здесь, не будет компилироваться. – Cheeso

+3

Я предпочел не указывать конкретный код и ПОЧЕМУ Я хочу использовать решение с фоном. Я выбрал «поддельный код», чтобы проиллюстрировать проблему и, надеюсь, получить педагогический ответ, а не обходной путь. Я задал вопрос, чтобы сформулировать свой вопрос таким образом, потому что я на самом деле хочу учиться на базовом примере, а не кому-то еще написать решение в коде для меня. Я выбрал этот неспецифический пример, так что, надеюсь, многие другие, которые, похоже, борются с подобной путаницей, могут относиться и учиться у него. – Roger

+1

Вы путаете нас своими странными словами! Педагогика: из, относительно или подобает учителю или образованию :) – VoidDweller

ответ

1

Я хотел бы использовать что-то вроде этого (очень поверхностна и непроверенный):

private void bgw_DoWork(object sender, DoWorkEventArgs e) 
    { 
     var list = new List<SomeRowType>(); 

     foreach (StuffObject STUFF in StuffCollection) 
     { 
      VARIABLE1 = STUFF.SubStuff1.ToString(); 
      VARIABLE2 = STUFF.SubStuff2.ToString(); 
      VARIABLE3 = STUFF.SubStuff3.ToString(); 
      //DatagridWiew1.Rows.Add(VALUE1, VALUE2, VALUE3); 
      list.Add(new SomeRowType(VALUE1, VALUE2, VALUE3)); //probably meant: VARIABLEn 
     } 
     e.Result = list; 
    } 

    private void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
     if (e.Error != null) 
     { 
     } 
     else 
     { 
      var list = (List<SomeRowType>)e.Result; 
      DatagridWiew1.DataSource = list; 
     } 
    } 
+0

Спасибо Хенк! Я попробую ваш пример завтра. В последнее время для кодирования прямо сейчас :) – Roger

1

Вот пример:

class Form1 : Form 
{ 
    private BackgroundWorker Worker { get; set; } 

    public Form1() 
    { 
     Worker = new BackgroundWorker(); 
     Worker.WorkerSupportsCancellation = true; 
     Worker.DoWork += OnWorkerDoWork; 
     Worker.RunWorkerCompleted += OnWorkerRunWorkerCompleted; 

     // at some point start the worker. 
     Worker.RunWorkerAsync(); 
    } 

    void OnWorkerDoWork(object sender, RunWorkerCompletedEventArgs e) 
    { 
     foreach(var data in someData) 
     { 
      // if cancelled 
      if (e.Cancelled) 
       return; 

      AddDataToColumn(someData.Var1, someData, Var2, someData.Var3); 
     } 
    } 

    void OnWorkerRunWorkerCompleted(object sender, DoWorkEventArgs e) 
    { 

    } 

    private delegate void AddDataToColumnDelegate(string var1, string var2, string var3); 
    private void AddDataToColumn(string var1, string var2, string var3) 
    { 
     // check if cross-thread operation 
     if (InvokeRequired) 
     { 
      Invoke(new AddDataToColumnDelegate(AddDataToColumn), var1, var2, var3); 
      return; 
     } 

     // Add data to column 
     dataGridView1.Rows.Add(var1, var2, var3); 
    } 
} 
Смежные вопросы