2010-04-03 58 views
5

我有以下方法:C#线程的方法

public List<string> someMethod() 
{ 

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

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

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

+2

程序是在创建后使用该文件,还是仅仅是其他程序读取的输出?完成导出后,您是否需要某种通知? – 2010-04-03 15:49:58

+0

我编辑了这个问题。好点 – DarthVader 2010-04-03 15:54:33

+0

WinForms,WPF,ASP.NET? – 2010-04-05 09:13:26

回答

4

This是一篇关于C#线程的优秀文章,任何想要了解C#线程的人都应该阅读。

但你情我愿做这样的事情:如果过程可能需要一些时间,你可以得到BackgroundWorker的汇报进度太

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 
    } 
} 

+0

+1。这是一篇*优秀*文章。 – 2010-04-03 17:26:15

2

如果您不希望用户等待操作完成,那就调用异步调用。

Asynchronus calls follow a pattern in .NET我建议你使用。

这种调用涉及(通常)使用ThreadPool在后台执行操作,然后在操作完成时调用给定的回调。你可以在这个回调中执行一些操作(由线程执行)。

该模型要求用户知道该过程是异步的。对于99%的情况来说,这实际上是一件好事,因为您需要能够告诉调用代码该任务尚未完成,您可以在中间返回控制权,但这并不意味着工作已完成。

2

如果您是通过WinForms或WPF UI执行此操作,则可以使用BackgroundWorker执行CVS转储,它可以在后台线程中完成工作,并在完成后向UI发送事件。

+0

是的,只有当OP使用Win/Wpf GUI – 2010-04-05 09:12:45

+0

好点时,答案已经更新。 – 2010-04-05 13:18:51