异步C#如何正确使用

问题描述 投票:0回答:1

我主要有两个函数,两个函数都将使用 Load winForm(事件)执行,现在第一个函数负责从数据库获取数据并在复选框列表控件中设置,该函数使用异步,等待,如图所示,我们获取案例类型,第二个函数执行然后(第一个函数)完成。 问题是第二个函数取决于这些案例或数据,假设它们已加载到控件中,发生的情况是第二个函数开始工作,而第一个函数实际上尚未加载案例,这是第一个函数(部分):

DataTable CasesTypeDataTable =await  clsRegulatoryCaseType.GetAllRegulatoryCaseTypesAsync();
 if(CasesTypeDataTable.Rows.Count > 0)
 {

     foreach (DataRow row in CasesTypeDataTable.Rows)
     {
         clbRegulatoryCasesTypes.Items.Add(row["RegulatoryCaseTypeName"]); // Add item using Name column
     }
 }

第二个函数,它将使用假设它正确加载到控件的情况


                // Populate the HashSet with the items of the CheckedListBox
                if (clbRegulatoryCasesTypes.Items.Count > 0)// It always equates with zero , and this is my problem 
                {

                    foreach (object item in clbRegulatoryCasesTypes.Items)
                {
                    clbItemsHashSet.Add(item.ToString());
                }
                }

我尝试删除异步,实际上一切恢复正常,我想了解到底发生了什么,为什么会发生这种情况,以及如果它们依赖时会严重影响我的应用程序,为什么我需要使用异步

c# asynchronous
1个回答
0
投票

尝试这样:

public MainForm()
{
    InitializeComponent();

    this.Load += MainForm_Load;
}

private void MainForm_Load(object? sender, EventArgs e)
{
    if (LoadFunc1()) {
        LoadFunc2();
    }
}

private bool LoadFunc1()
{
    try
    {
        var task = Task.Run(async () =>
        {
            DataTable CasesTypeDataTable = await clsRegulatoryCaseType.GetAllRegulatoryCaseTypesAsync();
            if (CasesTypeDataTable.Rows != null) 
            {
                if(CasesTypeDataTable.Rows.Count > 0)
                {
                    foreach (DataRow row in CasesTypeDataTable.Rows)
                    {
                        if(row == null) 
                        {
                            continue;
                        }
                        clbRegulatoryCasesTypes.Items.Add(row["RegulatoryCaseTypeName"]); // Add item using Name column
                    }
                }
            }
        });
        task.Wait(TimeSpan.FromMinutes(1));
        
        if (task.IsCompletedSuccessfully)
        {
            return true;
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
    return false;
}

private LoadFunc2()
{
    try
    {
        // Populate the HashSet with the items of the CheckedListBox
        if (clbRegulatoryCasesTypes.Items != null)
        {
            if (clbRegulatoryCasesTypes.Items.Count > 0)// It always equates with zero , and this is my problem 
            {
                foreach (object item in clbRegulatoryCasesTypes.Items)
                {
                    if(item == null) 
                    {
                        continue;
                    }
                    clbItemsHashSet.Add(item.ToString());
                }
            }
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.