【问题标题】:How to populate thread safe a ListView in c#?如何在 C# 中填充线程安全的 ListView?
【发布时间】:2010-02-15 11:08:13
【问题描述】:

我需要将一些 ListView 填充代码放在一个线程中。对于简单的情况,该线程不应运行两次。当我想发布一个新线程时,以前的线程需要停止,不管做什么。

编辑 1

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

在此运行之前,用户不能输入任何内容。因此,当您输入“abc”时,会有大量的闲逛,您只需在 10 秒后输入“c”。

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

编辑 2

仍在寻找更多答案。

【问题讨论】:

    标签: c# multithreading listview compact-framework


    【解决方案1】:

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

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

    限制从查询返回的结果数

    限制下限上限

    现在在您的线程方法中,使用“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)
    

    希望这会有所帮助。

    【讨论】:

    • 我会试试这个,但我不知道我是否能够检测到循环中的变化,因为事件只有在填充过程完成后才会触发。我去看看。
    • 您好 Pentium,刚刚试了一下。有用。让我知道它是否也适合你。检查我的伪代码编辑
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多