2010-02-15 28 views
3

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

EDIT 1

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

在运行之前,用户不能输入任何内容。所以当你输入“abc”时,会出现严重的问题,你只能在10秒后输入“c”。

所以我心里有问题线程的populateList()方法,并允许用户快速输入更多的东西。文本越慢,SQL查询就越慢。 在“abc”情况下,如果键入“a”代码后退并运行查询,但与此同时,如果用户按下“b”,我想停止执行“a”线程并立即发出新线程使用“ab”...等等与“c”。

EDIT 2

还在寻找更多的答案。

回答

1

我不知道我是否得到了正题吧......如果你正在处理多个线程,由于某种原因要停止前一个线程,可以在新线程检查前一个线程是否还活着,并放弃其行为突然...如果这不是你所期望的,请你详细说明你的问题?

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

LIMIT LOWERLIMIT UPPERLIMIT

现在,在你的线程的方法从查询返回结果数量,使用“的”循环通过结果集并在每次迭代中检查文本框文本是否已更改。如果它改变了,那么打破循环,清除列表,转到线程方法的开始,并使用相同的线程执行相同的过程,但textfilter不同。

伪代码:

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) 

希望这有助于。

+0

看到我的编辑问题 – Pentium10 2010-02-16 12:30:41

+0

我会试试这个,但我不知道我是否能够检测到循环中的变化,因为事件接缝仅在人口过程完成后触发。我会看看。 – Pentium10 2010-02-17 11:54:57

+0

嗨奔腾,刚试过。有用。让我知道它是否也适用于您。检查我编辑的伪代码 – Amsakanna 2010-02-20 19:50:24