2010-08-07 46 views
2

我是windows.forms編程的新手。我開始做有以下事件流的應用:windows.forms中的代碼位置

  • 點擊打開文件按鈕 - 提取其內容在字符串中的一些列表 - 訪問一些網站 - 解析他們的內容 - 等

因此,我點擊一個按鈕打開一個文件後,我的應用程序中的所有內容都發生了,我已將所有代碼放在按鈕的單擊事件中。但是我確實知道這是不好的編碼習慣,因爲我意識到我最終會讓所有程序在該點擊事件中流動。我知道事件應該只包含與該按鈕相關的代碼,但是如果不在事件內部的位置,則放置在後面的代碼的位置?是否有另一個事件,我應該使用,而不是隻寫按鈕點擊所有?

我希望我已經明確了我的問題。如果沒有,我會重試解釋我的問題。我只是不知道在哪裏編寫點擊事件後面的代碼。如果我把它放在:

public Form1() 
{ 
    InitializeComponent(); 
} 

..然後它執行前點擊事件是錯誤的。

預先感謝您。

回答

4

執行此操作的典型方法是編寫一個或多個執行操作的方法,並從click事件中調用這些方法。對於任何長時間運行的操作,請在後臺工作線程中執行它們。

例如:

public void myButton_OnClick(EventArgs e, object sender) 
{ 
    VisitWebSites(); 
} 

private void VisitWebSites() 
{ 
    var webSiteList = GetWebSitesFromFile(); 
    foreach (var w in webSiteList) { 
     StartVisitingWebSite(w); 
    } 
} 

private IEnumerable<string> GetWebSitesFromFile() 
{ 
    // whatever 
} 

private void StartVisitingWebSite(string url) 
{ 
    backgroundWorker1.RunWorkerAsync(url); 
} 

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
{ 
    string url = (string)e.Argument; 
    e.Result = VisitWebSite(url); 
} 

private string VisitWebSite(string url) 
{ 
    // This is called in background thread. Do whatever you do to return data. 
} 

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    if (e.Error || e.Cancelled) 
     return; 

    string result = e.Result.ToString(); 

    // Do whatever you do with the result 
} 

看那BackgroundWorker文檔,以瞭解如何在後臺線程中執行的操作,然後處理他們的成果。

+0

優秀的答案 - 你向我解釋清楚,通過正確命名方法幫助我理解片段,併爲我提供了多線程課程。 非常感謝你! – 2010-08-07 20:11:11

1

您可以將您想要做的所有工作封裝到窗體類中的另一個函數中。它的修改權限當然是PRIVATE(除非你希望另一個類能夠訪問該方法)。從你的button_click事件處理程序的內部,你可以調用這個新的函數。這是最簡單的方法。否則,您可以使用上述鏈接中提供的示例@Robert S.