Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# datagridview在c中加载数据时UI没有响应_C#_Datagridview_Listbox_Backgroundworker - Fatal编程技术网

C# datagridview在c中加载数据时UI没有响应

C# datagridview在c中加载数据时UI没有响应,c#,datagridview,listbox,backgroundworker,C#,Datagridview,Listbox,Backgroundworker,我在winforms中有一个列表框、datagridview和文本框 这就是我要做的 当用户在listbox中选择一个项目时,datagridview将加载与所选项目相关的一些数据,并且还有一个自动完成文本框,其中包含一个自定义源,该源根据所选项目动态更改 datagridview和autocomplete文本框的数据源来自rdbms MYSQL private void listBox1_SelectedValueChanged(object sender, EventArgs e) {

我在winforms中有一个列表框、datagridview和文本框

这就是我要做的

当用户在listbox中选择一个项目时,datagridview将加载与所选项目相关的一些数据,并且还有一个自动完成文本框,其中包含一个自定义源,该源根据所选项目动态更改

datagridview和autocomplete文本框的数据源来自rdbms MYSQL

private void listBox1_SelectedValueChanged(object sender, EventArgs e)
{
    string item=listBox1.SelectedValue.Tostring();
    UpdateDataGridView(item);
    UpdateACTextBox(item);
}
在完成此操作之前,用户无法在listbox中选择其他项目,完成此操作几乎需要10秒

为了解决这个问题,我遇到了一些解决方案,比如异步方法

解决这个问题的最佳方法是什么

背景工作者, 异步并等待, 线程池, 多线程

如果我没有进行适当的研究,请提出一些建议

开发人员处理此类问题的常规方法是什么

更新:

我忘了提到我正在使用VS2010。因为vs2010不支持异步和等待。我想我需要放弃这个选择


提前感谢

在我看来,问题在于加载到listView的数据量太大了。所以我建议将后台任务与listView的VirtualMode结合使用。在虚拟模式下,数据不存储在listView内部,您必须将外部的值存储在自己的列表中。如果需要,listView将调用一个事件来询问您的值。如果数据不可用,只需返回一个伪值或使用旧值。这将使listview简单地空白或显示旧值。在完成值在列表中的复制后,只需使用原子操作交换列表的指针变量。从那时起,新数据用于更新列表,而不是旧数据。调用更新函数以加载新值。这种方法允许它在后台更新数据,并随时更新。唯一的缺点是您需要存储列表的值两次。在显示的旧缓冲区内和当前更新的新缓冲区内。我希望这能有所帮助。

这取决于你在哪里有更多的经验。我通常使用async/awayt和call方法只返回数据,而不调用这些方法中的任何UI属性。之后,所有内容都绑定到UI元素。@Eugen是否可以在返回datatable的方法中使用async/await?因为我读到async/await应该只在void方法上使用,Task@CSTRAIZE,你在哪里读到的?void返回方法仅适用于listBox1_SelectedValueChanged之类的事件处理程序,但其他所有方法都应返回Task或Task。@PauloMorgado,我理解。我还有一个疑问,当用户单击listbox中的一个项目时,一个作业会以该项目值异步完成10秒,同时当用户选择另一个项目和另一个项目时。这是否意味着,工作将在10秒钟+10秒钟内完成,然后UI响应。在数据库世界中,10秒钟是很长的时间。虽然后台工作人员可能会有所帮助,但在UpdateDagRidView或UpdateActTextBox方法中,您可能在做一些基本上很慢的事情。你没有给我们看。