2010-04-03 75 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