C# windows.forms中的代码放置
我不熟悉windows.forms编程。我开始制作一个具有以下事件流的应用程序:C# windows.forms中的代码放置,c#,winforms,C#,Winforms,我不熟悉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.提供的链接中的示例。非常好的答案-您向我清楚地解释了它,通过正确命名方法帮助我理解了代码片段,还为我上了多线程的一课。非常感谢你!