我有以下方法:
public List<string> someMethod()
{
// populate list of strings
// dump them to csv file
//return to output
}
问题是:我不希望用户等待csv转储,这可能需要一段时间。 如果我使用csvdump的线程,它会完成吗?在输出返回之前或之后?
csvdump完成后,我想通知另一个类来处理csv文件。 someMethod不需要等待csvdump完成?
答案 0 :(得分:4)
This是一篇关于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报告它的进度。
答案 1 :(得分:2)
如果您不希望用户等待操作完成,则调用异步调用。
Asynchronus calls follow a pattern in .NET我建议您使用。
这种调用涉及(通常)使用ThreadPool在后台执行操作,然后在操作完成时调用给定的回调。你可以在这个回调中做一些事情(由线程执行)。
此模型要求用户知道该过程是异步的。这对于99%的情况来说实际上是一件好事,因为你需要能够告诉调用代码该任务还没有,你可以立即返回控件,但这并不意味着工作已经完成。 / p>
答案 2 :(得分:2)
如果您是从WinForms或WPF UI执行此操作,则可以使用BackgroundWorker
执行CVS转储,这可以在后台线程中完成工作,并在事件发生时向UI发送事件完整。