Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# windows.forms中的代码放置_C#_Winforms - Fatal编程技术网

C# windows.forms中的代码放置

C# windows.forms中的代码放置,c#,winforms,C#,Winforms,我不熟悉windows.forms编程。我开始制作一个具有以下事件流的应用程序: 单击打开文件的按钮-提取字符串列表中的内容-访问一些网站-解析其内容-等等 因此,因为我的应用程序中的所有内容都发生在我单击按钮打开文件之后,所以我将所有代码都放在按钮的单击事件上。然而,我知道这是一种糟糕的编码实践,因为我意识到我最终将所有的程序流都包含在点击事件中。我知道事件应该只包含与按钮相关的代码,但是如果不在事件内部,那么接下来的代码应该放在哪里呢?我是否应该使用另一个事件,而不只是在按钮单击中写入所

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

  • 单击打开文件的按钮-提取字符串列表中的内容-访问一些网站-解析其内容-等等
因此,因为我的应用程序中的所有内容都发生在我单击按钮打开文件之后,所以我将所有代码都放在按钮的单击事件上。然而,我知道这是一种糟糕的编码实践,因为我意识到我最终将所有的程序流都包含在点击事件中。我知道事件应该只包含与按钮相关的代码,但是如果不在事件内部,那么接下来的代码应该放在哪里呢?我是否应该使用另一个事件,而不只是在按钮单击中写入所有内容

我希望我的问题已经讲清楚了。如果没有,我将尝试解释我的问题。我只是不知道在单击事件之后在哪里编写代码。如果我把它放进去:

public Form1()
{
    InitializeComponent();
}
…然后在错误的单击事件之前执行


提前感谢。

您应该查看模型视图演示者模式

执行此操作的典型方法是编写一个或多个执行操作的方法,并从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
}
public void myButton\u OnClick(事件参数e,对象发送方)
{
VisiteWebSites();
}
私有无效访问网站()
{
var websitelest=GetWebSitesFromFile();
foreach(网站列表中的var w){
StartVisiting网站(w);
}
}
私有IEnumerable GetWebSitesFromFile()文件
{
//随便
}
私有void StartVisitingWebSite(字符串url)
{
backgroundWorker1.RunWorkerAsync(url);
}
私有void backgroundWorker1\u DoWork(对象发送方,DoWorkEventArgs e)
{
字符串url=(字符串)e.Argument;
e、 结果=访问网站(url);
}
私有字符串VisiteBSite(字符串url)
{
//这是在后台线程中调用的。请执行任何操作以返回数据。
}
私有void backgroundWorker1\u RunWorkerCompleted(对象发送方,runworkercompletedeventarge)
{
如果(e.错误| | e.取消)
回来
字符串结果=e.result.ToString();
//不管你对结果做什么
}

查看文档,了解如何在后台线程中执行操作,然后处理其结果。

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

非常好的答案-您向我清楚地解释了它,通过正确命名方法帮助我理解了代码片段,还为我上了多线程的一课。非常感谢你!