如何在c#中使用ListView填充线程安全?

时间:2010-02-15 11:08:13

标签: c# multithreading listview compact-framework

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

编辑1

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

在此运行之前,用户无法输入任何内容。因此,当您输入“abc”时会出现断断续续的断电,您只需在10秒后输入“c”。

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

编辑2

仍在寻找更多答案。

1 个答案:

答案 0 :(得分:1)

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

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

限制从查询返回的结果数
  

LIMIT lowerLimit upperLimit

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

PSEUDO CODE:

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)

希望这有帮助。