Поточная обработка C# в методе

У меня есть следующий метод:

public List<string> someMethod()
{

   // populate list of strings
   // dump them to csv file
   //return to output
}

Вопрос: я не хочу, чтобы пользователь ожидал дампа csv, который мог бы требовать времени. Если я буду использовать поток для csvdump, то он завершится? прежде или после возврата вывода?

После того, как csvdump закончен, я хотел бы уведомить другой класс для обработки файла CSV. someMethod does не должен ожидать csvdump для окончания?

5
задан DarthVader 3 April 2010 в 15:54
поделиться

3 ответа

Эта - отличная статья о многопоточности C #, которую следует прочитать всем, кто хочет знать о многопоточности C #.

Но для вашей ситуации я бы сделал что-то вроде этого:

class Program {
  static BackgroundWorker bw;
  static void Main() {
    bw = new BackgroundWorker();
    bw.WorkerSupportsCancellation = true;
    bw.DoWork += bw_DoWork;
    bw.RunWorkerCompleted += bw_RunWorkerCompleted;

    bw.RunWorkerAsync ();
  }

  static void bw_DoWork (object sender, DoWorkEventArgs e) {
    //Run your code here
  }

  static void bw_RunWorkerCompleted (object sender, RunWorkerCompletedEventArgs e) {
    //Completed
  }
}

Если процесс может занять некоторое время, вы можете также заставить BackgroundWorker сообщать о ходе выполнения.

4
ответ дан 14 December 2019 в 04:34
поделиться

Если вы делаете это из пользовательского интерфейса WinForms или WPF, вы можете использовать BackgroundWorker для создания дампа CVS, который может работа в фоновом потоке и отправка события пользовательскому интерфейсу по завершении.

2
ответ дан 14 December 2019 в 04:34
поделиться

Если вы не хотите, чтобы пользователь ждал завершения операции, это вызовет асинхронный вызов.

Асинхронные вызовы следуют шаблону .NET , который я предлагаю вам использовать.

Этот вид вызовов включает (обычно) использование ThreadPool для выполнения действия в фоновом режиме и последующий вызов заданного обратного вызова по завершении действия. Вы можете что-то сделать в этом обратном вызове (который выполняется потоком).

Эта модель требует, чтобы пользователь знал, что процесс является асинхронным. На самом деле это хорошо для 99% случаев, потому что вам нужно иметь возможность сообщить вызывающему коду, что задача еще не выполнена, вы сразу же возвращаете элемент управления, но это не означает, что работа завершена.

2
ответ дан 14 December 2019 в 04:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: