c# - 如何在 C# 中填充线程安全的 ListView?

标签 c# multithreading listview compact-framework

我需要在线程中放置一些 ListView 填充代码。对于简单的情况,该线程不应运行两次。当我想发布一个新线程时,之前的线程需要停止,无论如何。

编辑 1

场景如下。
我在 ListView 上方有一个文本过滤器。在 textchange 上,我调用了 populateList() 方法。
问题是代码可能需要更长的时间,因为它在更大的数据库上使用 SQL LIKE 语法。

在此运行之前,用户不能输入任何内容。因此,当您输入“abc”时会出现严重的挂起,您只能在 10 秒后输入“c”。

所以我想在线程中发出 populateList() 方法并允许用户快速输入更多内容。文本越长,SQL 查询就越慢。 在“abc”的情况下,如果你输入“a”,代码会落后并运行查询,但同时如果用户按下“b”,我想停止执行“a”线程,并发出一个新线程,现在使用“ab”...等等与“c”。

编辑 2

仍在寻找更多答案。

最佳答案

我不知道我是否答对了......如果你正在处理多个线程并且由于某种原因你想停止前一个线程,你可以检查新线程是否存在前一个线程并放弃它突然采取行动...如果这不是您所期望的,您能否详细说明您的问题?

更新:
现在我非常理解你的问题了。即使我正在处理这样的问题,但数据库在内存中。在您的情况下,如果您的数据库支持 LIMIT 那么您可以使用

限制从查询返回的结果数

LIMIT lowerLimit upperLimit

现在在线程的方法中,使用“for”循环遍历结果集,并在每次迭代中检查文本框文本是否已更改。如果它被更改,则中断循环,清除列表,转到线程方法的开始并使用相同的线程执行相同的过程,但文本过滤器不同。

伪代码:

do
  isLoop = false
  clear the collection that is bound to the listbox
  from db, get the record count     
    for: loop 0 to recordcount increment batchsize
      get chuncks of data from db of size batchsize
      add the data to collection [using dispatcher.invoke]
      if textbox text changed
        isLoop = true
        break for-loop
      endif
    endfor
while(isLoop)

希望这对您有所帮助。

关于c# - 如何在 C# 中填充线程安全的 ListView?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2265452/

相关文章:

c# - 用于在 Telegram 上部署的 Bot Framework 中的新行

multithreading - Scala Future[T] 是否在内部阻塞? Scala Future 内部会发生什么?

c++ - 以任意顺序加入多个线程

Android:将数据从数据库绑定(bind)到 ListView

Android禁用滚动并单击 ListView

c# - 数组初始值设定项只能用于变量或字段初始值设定项吗?

c# - 定时器内的日期比较

c# - 使用本地 C# 应用程序检查 Windows 中的 MaxPasswordAge

c# - 后台线程中的 LowLevelMouseProc

Android - 在 ListView 中滚动时滚出/折叠元素