【问题标题】:Code placement in windows.formswindows.forms 中的代码放置
【发布时间】:2010-08-07 18:27:21
【问题描述】:

我是 windows.forms 编程的新手。我开始制作一个具有以下事件流的应用程序:

  • 单击打开文件的按钮 - 在某些字符串列表中提取其内容 - 访问某些网站 - 解析其内容 - 等等。

因此,因为我的应用程序中的所有内容都是在我单击按钮打开文件后发生的,所以我已将所有代码放在按钮的单击事件上。但是我知道这是不好的编码习惯,因为我意识到我最终在该点击事件中拥有了所有程序流。我知道事件应该只包含与按钮相关的代码,但是如果不在事件内部,那么在哪里放置后面的代码?我应该使用另一个事件而不是只在按钮单击中写入所有事件吗?

我希望我已经把我的问题说清楚了。如果没有,那么我将重试解释我的问题。我根本不知道在哪里编写点击事件之后的代码。如果我把它放进去:

public Form1()
{
    InitializeComponent();
}

..然后它在错误的点击事件之前执行。

提前谢谢你。

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

    执行此操作的典型方法是编写一个或多个执行操作的方法,并从点击事件中调用这些方法。对于任何长时间运行的操作,请在后台工作线程中执行。

    例如:

    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 文档,了解如何在后台线程中执行操作,然后处理其结果。

    【讨论】:

    • 很好的答案——你向我解释得很清楚,通过正确命名方法帮助我理解了 sn-p,还为我上了一课多线程。非常感谢!
    【解决方案2】:

    您可以将所有您想做的工作封装到表单类中的另一个函数中。它的修改访问当然是私有的(除非您希望另一个类能够访问该方法)。在 button_click 事件处理程序内部,您可以调用这个新函数。这是最简单的方法。否则,您可以使用@Robert S 上面链接中提供的示例。

    【讨论】:

      【解决方案3】:

      您应该研究 Model View Presenter 模式。 http://msdn.microsoft.com/en-us/magazine/cc188690.aspx

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-29
        • 2014-06-20
        相关资源
        最近更新 更多