2010-08-07 44 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.