C# 数据库上的异步操作

C# 数据库上的异步操作,c#,.net,winforms,asynchronous,sql-server-ce,C#,.net,Winforms,Asynchronous,Sql Server Ce,我正在构建一个WF应用程序“时事通讯”,以向选定的电子邮件组发送电子邮件,这些电子邮件组是从此应用程序创建的,并存储在一个.sdf数据库中,该数据库是SQL Server Compact Edition,内置于Visual Studio 2012中 到目前为止,我已经在主线程上运行了这个应用程序,但这不是应该用于数据库的方法,我希望异步地在数据库上执行所有操作。我读过一些方法,但我从未使用过它们,对此感到困惑 对于对DB和关系的外观感兴趣的ppl,请阅读下面的方括号: 截至目前,共有2个表格:

我正在构建一个WF应用程序“时事通讯”,以向选定的电子邮件组发送电子邮件,这些电子邮件组是从此应用程序创建的,并存储在一个
.sdf
数据库中,该数据库是SQL Server Compact Edition,内置于Visual Studio 2012中

到目前为止,我已经在主线程上运行了这个应用程序,但这不是应该用于数据库的方法,我希望异步地在数据库上执行所有操作。我读过一些方法,但我从未使用过它们,对此感到困惑

对于对DB和关系的外观感兴趣的ppl,请阅读下面的方括号:

截至目前,共有2个表格:

  • 电子邮件
    (int UniqueID,字符串电子邮件)
  • (int-ID,string-Grupa)
  • 第一个表中的PK为
    UniqueID+Email
    ,第二个表中的PK为
    ID+string
    ,第二个表中的FK至表1为
    ID
    ,并连接到
    UniqueID

    我将添加第三个表,其中包含
    ExistingGroups
    和1列
    ExstGroup
    ,它将与表2相关,其中
    Grupa
    将被FK到
    ExistingGroups
    ,这个第三个表将存储数据库中所有组的名称,并将用于动态创建复选框(存储在checkedListBox中?)当应用程序启动时,它将在FormLoad事件中触发,我想,如果我错了,请纠正我

    我想使用ADO.net连接层方法,因此这里有几个问题:

  • 在Form_Load事件期间,我应该在哪里建立到数据库(conn.Open())的连接?我是否应该检查此连接是否打开,b4是否试图在DB上执行任何操作

  • 下面是从DB获取电子邮件并将其插入hashset以将这些电子邮件传递给
    SendingEmail
    函数的代码片段。如何将其转换为异步

     // CheckedEmails is Form variable to store emails from groups which where checked on checkboxes.
     HashSet<string> CheckedEmails = new HashSet<string>(); 
    
     private HashSet<string> ListOfEmails()
     {
            CheckedEmails.Clear();
    
            Queue<string> checkBoxes = new Queue<string>();
            if (IT_checkbox.Checked) //checking all checkboxes this way..
            {
                checkBoxes.Enqueue(IT_checkbox.Text);
            }
    
            SqlCeCommand cmd = conn.CreateCommand();
    
            while (checkBoxes.Count() != 0)
            {
                cmd.CommandText = string.Format("Select Email FROM Emails INNER JOIN Groups ON Emails.UniqueID=Groups.ID WHERE Groups.Grupa='{0}' ", checkBoxes.Dequeue());
                SqlCeDataReader dr = cmd.ExecuteReader();
    
                while (dr.Read())
                {
                   CheckedEmails.Add((string)dr["Email"]);//adding emails fromcheckedgroups
                }
                dr.Close();
            }
            return CheckedEmails;
     }
    
    //CheckedEmails是表单变量,用于存储来自选中复选框的组的电子邮件。
    HashSet CheckedEmails=新HashSet();
    私有HashSet ListOfEmails()
    {
    checkedmails.Clear();
    队列复选框=新队列();
    if(IT_checkbox.Checked)//以这种方式检查所有复选框。。
    {
    checkbox.Enqueue(IT_checkbox.Text);
    }
    SqlCeCommand cmd=conn.CreateCommand();
    while(复选框.Count()!=0)
    {
    cmd.CommandText=string.Format(“从电子邮件中选择电子邮件,在电子邮件中加入组。UniqueID=Groups.ID,其中Groups.Grupa='{0}',checkbox.Dequeue());
    SqlCeDataReader dr=cmd.ExecuteReader();
    while(dr.Read())
    {
    CheckedEmails.Add((字符串)dr[“Email”]);//添加来自checkedGroups的电子邮件
    }
    Close博士();
    }
    退回支票邮件;
    }
    
  • 2A)假设在DB上执行此操作成本高昂且需要一些时间,我如何防止用户在执行此操作时多次在DB上执行此操作,或在DB上执行其他操作(如添加新电子邮件)

    3.我可以使用一些东西让用户知道数据库上的操作当前正在运行,比如一些进度条或将鼠标光标更改为加载?怎么做


    提前感谢大家的帮助,我尽量做到精确,但如果有什么不可理解的,请询问。

    2)您可以使用异步和等待功能;)

    我写了违反规定的东西吗?如果是,请告诉我第3个问题:尝试在项目中添加progressbar控件,其值随着while循环的进行而增加。只需使用Backgroundworker组件即可。我问了几个问题,请回答您要回答的问题。如果我在ListoFeails{Task.run(()=>{我的ListoFeails函数中的代码})中运行;返回支票邮件;}可以吗?