当前位置:编程学习 > C#/ASP.NET >>

多线程 LISTBOX

--------------------编程问答-------------------- LISTBOX 数据太多,用户选择体验效果也不好
可通过datagridview等分页选择数据
--------------------编程问答-------------------- for (int i = 0; i < listView1.Items.Count)
{
    ProcessItem(ListView1.Items[i]);
    System.Threading.DoEvents();
}

void ProcessItem(ListViewItem li)
{
    string s = li.Text;
    Do(s);
    li.Text = new value;
} --------------------编程问答--------------------
引用 2 楼 caozhy 的回复:
for (int i = 0; i < listView1.Items.Count)
{
    ProcessItem(ListView1.Items[i]);
    System.Threading.DoEvents();
}

void ProcessItem(ListViewItem li)
{
    string s = li.Text;
    Do(s);
……


多谢,我用的是VB.NET,你这是C#的吧?看不太懂
能否解释一下?

--------------------编程问答-------------------- 学习。对于多线程的相关知识知道的很少。等待高手解答 --------------------编程问答--------------------
引用 3 楼 axuad 的回复:
引用 2 楼 caozhy 的回复:

for (int i = 0; i < listView1.Items.Count)
{
  ProcessItem(ListView1.Items[i]);
  System.Threading.DoEvents();
}

void ProcessItem(ListViewItem li)
{
  string s = li.Text……

Dim i As Integer
For i = 0 To listView1.Items.Count
    ProcessItem(ListView1.Items(i))
    System.Threading.DoEvents
Next

假设你在 ProcessItem 处理你的数据。 --------------------编程问答-------------------- ivate Delegate Sub CopyListItemCallBaCk()

Private Sub button1_Click(sender As Object, e As EventArgs)
Dim t As New Thread(New ThreadStart(AddressOf CopyListItem))
t.Start()
End Sub

Private Sub CopyListItem()
If Me.listBox1.InvokeRequired OrElse Me.listBox2.InvokeRequired Then
Dim cb As New CopyListItemCallBaCk(AddressOf CopyListItem)
Me.Invoke(cb)
Else
listBox2.Items.Clear()
For Each o As Object In listBox1.Items
listBox2.Items.Add(o)
Next
End If
End Sub
--------------------编程问答-------------------- Private Sub Form1_Load(sender As System.Object, e As System.EventArgs)
Dim td As New System.Threading.Thread(AddressOf additem)
td.Start()
End Sub
Public Delegate Sub addInvo()
Public Sub additem()
If ListView1.InvokeRequired = False Then
ListView1.Columns.Add("ID")
ListView1.Columns.Add("Data")
ListView1.Items.Add("0")
ListView1.Items(0).SubItems.Add("a")
ListView1.BackColor = Color.Yellow
ListView1.View = View.Details
Else
Dim del As New addInvo(AddressOf additem)
ListView1.Invoke(del)
End If
End Sub
--------------------编程问答-------------------- --------------------编程问答--------------------
引用 2 楼 caozhy 的回复:
for (int i = 0; i < listView1.Items.Count)
{
    ProcessItem(ListView1.Items[i]);
    System.Threading.DoEvents();
}

void ProcessItem(ListViewItem li)
{
    string s = li.Text;
    Do(s);
……



ProcessItem(ListView1.Items[i])这个值如何传给多个线程的?要用带参数的线程吗?

求示例代码,谢谢


--------------------编程问答-------------------- 楼主的思路有问题,多线程和listbox没什么关系。listbox 是UI上的东西,你的数据,应该保存在一个 List<T> 里,可以试试线程池来处理这些 item,代码类似于这个:

foreach item
{
ThreadPool.QueueUserWorkItem(x => process(x));
}



--------------------编程问答--------------------
引用 10 楼 phil999 的回复:
楼主的思路有问题,多线程和listbox没什么关系。listbox 是UI上的东西,你的数据,应该保存在一个 List<T> 里,可以试试线程池来处理这些 item,代码类似于这个:

foreach item
{
ThreadPool.QueueUserWorkItem(x => process(x));
}

多谢提醒,将数据放在LISTBOX 再由线程来提取不行吗?
能否给我个较完整的示例?


--------------------编程问答-------------------- 放在LISTBOX 再由线程来提取是可以的,看个人爱好:

private void process(object o)
{
...
}


foreach(var item in listbox1.items)
{
ThreadPool.QueueUserWorkItem(x => process(item));
}


--------------------编程问答--------------------
引用 12 楼 phil999 的回复:
放在LISTBOX 再由线程来提取是可以的,看个人爱好:

private void process(object o)
{
...
}


foreach(var item in listbox1.items)
{
ThreadPool.QueueUserWorkItem(x => process(item));
}


恳请这段较完整代码,
本人对多线程实在一时半会掌握不了。万后感谢,给分! --------------------编程问答-------------------- phil999

帮我写这个多线程的代码,付费也可以,加我Q:89281060 --------------------编程问答--------------------
引用 14 楼 saynowhy 的回复:
phil999

帮我写这个多线程的代码,付费也可以,加我Q:89281060

比较急
补充:.NET技术 ,  VB.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,