c#:事件驱动代码中的操作顺序不';不匹配流

c#:事件驱动代码中的操作顺序不';不匹配流,c#,list,event-handling,C#,List,Event Handling,代码流没有遵循我的逻辑,我的列表也没有得到所需的输出 public static List<String> genericList; public static List<String> List1; 公共静态列表genericList; 公共静态列表列表1; 在frmLoadCurrentForm()中: List1=新列表(); genericList=新列表(); 然后,在不同的地方(?按钮) 1私有无效btn1\u单击(对象发送者,事件参数e) 2 { 3

代码流没有遵循我的逻辑,我的列表也没有得到所需的输出

public static List<String> genericList;
public static List<String> List1;
公共静态列表genericList;
公共静态列表列表1;
在frmLoadCurrentForm()中:

List1=新列表();
genericList=新列表();
然后,在不同的地方(?按钮)

1私有无效btn1\u单击(对象发送者,事件参数e)
2 {
3 genericList=List1.ToList();
4调用();
5 List1=genericList.ToList();
6 }
私有无效调用()
{
frmForm form=新frmForm();
对于(int i=0;i
在单步执行代码时,我在第5行上放置了一个断点,代码先到第5行,然后到第4行(并进入表单),然后再不返回到第5行-因此我的列表1不会根据调用()中发生的情况进行更新

我不明白这个逻辑,也不知道该怎么办

我使用多个列表和一个泛型列表,这样我就可以在多种情况下使用复杂的接口,理论上我的逻辑似乎是有效的

在表单的出口处,genericList有正确的信息,List1没有。为什么?

编辑:添加列表声明


编辑:当我逐步完成时,表单将开始呈现,但直到调用创建表单的方法的按钮末尾的代码被执行后才会完成。更奇怪的是,因为表单实例是在一个方法中创建的,所以应该在方法的末尾关闭并处理它…

好吧,在第5行设置断点,就不会运行第5行;但4号线的通话仍将继续,节目将正常进行。第4行,您调用了一个函数,该函数有效地运行,然后在返回时停止

断点仅在程序执行该特定行时触发。C#不会线性地执行代码,它可以,但它不遵守这个规则

看看这是一个地图软件,它可能会给你一个更好的想法,视觉上


如果我的回答是错误的,请通知我,因此我不会传播错误信息。谢谢

那么,在第5行设置断点,就不会运行第5行;但4号线的通话仍将继续,节目将正常进行。第4行,您调用了一个函数,该函数有效地运行,然后在返回时停止

断点仅在程序执行该特定行时触发。C#不会线性地执行代码,它可以,但它不遵守这个规则

看看这是一个地图软件,它可能会给你一个更好的想法,视觉上


如果我的回答是错误的,请通知我,因此我不会传播错误信息。谢谢

尽管我不清楚您在用上述代码做什么,但您应该知道,Form.Show()仅在打开的表单已关闭时返回,这可能是您感到困惑的原因之一

此外,我不知道您希望对方法ToList()的调用做什么,因为此方法的目的是从IEnumerable对象生成列表对象,但您似乎从列表生成列表,这对我来说没有意义

我没有测试您的代码,但我认为您的代码应该按照上面所写的方式执行,没有任何问题,这意味着当您单击事件处理方法btn1_click被称为执行的按钮时,应该如下所示:

  • 第3行的执行
  • 控件进入call()块中的代码并按顺序进行,直到Form.Show()调用为止。此调用允许显示表单,并再次将执行分支到内部表单代码
  • 关闭表单后,执行返回到form.Show()调用后的第一行,该调用是方法的右括号
  • 下一个要执行的语句是事件处理方法的第5行

  • 当您在btn1_Click方法的声明行放置断点,并以逐步方式逐步浏览代码时,您应该完全体验到这种行为。

    虽然我不清楚您在使用上述代码做什么,但您应该知道Form.Show()仅当打开的表单已关闭时返回-这可能是您感到困惑的原因之一

    此外,我不知道您希望对方法ToList()的调用做什么,因为此方法的目的是从IEnumerable对象生成列表对象,但您似乎从列表生成列表,这对我来说没有意义

    我没有测试您的代码,但我认为您的代码应该按照上面所写的方式执行,没有任何问题,这意味着当您单击事件处理方法btn1_click被称为执行的按钮时,应该如下所示:

  • 第3行的执行
  • 控件进入call()块中的代码并按顺序进行,直到Form.Show()调用为止。此调用允许显示表单,并再次将执行分支到内部表单代码
  • 关闭表单后,执行返回到form.Show()调用后的第一行,该调用是方法的右括号
  • 下一个要执行的语句是事件处理方法的第5行

  • 当您在btn1_Click方法的声明行上放置断点并以一步一步的方式逐步遍历代码时,您应该完全体验到这种行为。

    这肯定是线程问题


    为了以最简单的方式解决它(而不是创建单独的线程),我将
    form.Show()
    替换为
    form.ShowDialog()

    这肯定是一个线程问题

    为了以最简单的方式解决它(而不是创建单独的线程),我替换了
    表单
    
    List1 = new List<String>();
    genericList = new List<String>();
    
    1 private void btn1_Click(object sender, EventArgs e)
    2 {
    3     genericList = List1.ToList();
    4     call(); 
    5     List1 = genericList.ToList();
    6 }
    private void call()
    {
        frmForm form = new frmForm();            
        for (int i = 0; i < genericList.Count(); i++)
            form.lst.Items.Add(genericList.ElementAt(i));
        form.Show();
        //form updates genericList on exit with lst contents, tested
    }