C#方法中的线程化

时间:2010-04-03 15:47:05

标签: c# .net multithreading

我有以下方法:

public List<string> someMethod()
{

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

问题是:我不希望用户等待csv转储,这可能需要一段时间。 如果我使用csvdump的线程,它会完成吗?在输出返回之前或之后?

csvdump完成后,我想通知另一个类来处理csv文件。 someMethod不需要等待csvdump完成?

3 个答案:

答案 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发送事件完整。