У меня есть следующий метод:
public List<string> someMethod()
{
// populate list of strings
// dump them to csv file
//return to output
}
Вопрос: я не хочу, чтобы пользователь ожидал дампа csv, который мог бы требовать времени. Если я буду использовать поток для csvdump, то он завершится? прежде или после возврата вывода?
После того, как csvdump закончен, я хотел бы уведомить другой класс для обработки файла CSV. someMethod does не должен ожидать csvdump для окончания?
Эта - отличная статья о многопоточности 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 сообщать о ходе выполнения.
Если вы делаете это из пользовательского интерфейса WinForms или WPF, вы можете использовать BackgroundWorker
для создания дампа CVS, который может работа в фоновом потоке и отправка события пользовательскому интерфейсу по завершении.
Если вы не хотите, чтобы пользователь ждал завершения операции, это вызовет асинхронный вызов.
Асинхронные вызовы следуют шаблону .NET , который я предлагаю вам использовать.
Этот вид вызовов включает (обычно) использование ThreadPool для выполнения действия в фоновом режиме и последующий вызов заданного обратного вызова по завершении действия. Вы можете что-то сделать в этом обратном вызове (который выполняется потоком).
Эта модель требует, чтобы пользователь знал, что процесс является асинхронным. На самом деле это хорошо для 99% случаев, потому что вам нужно иметь возможность сообщить вызывающему коду, что задача еще не выполнена, вы сразу же возвращаете элемент управления, но это не означает, что работа завершена.