我主要有两个函数,两个函数都将使用 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());
}
}
我尝试删除异步,实际上一切恢复正常,我想了解到底发生了什么,为什么会发生这种情况,以及如果它们依赖时会严重影响我的应用程序,为什么我需要使用异步
尝试这样:
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);
}
}