gpt4 book ai didi

c# - 使用线程来计算 C# 事件中的循环

转载 作者:行者123 更新时间:2023-11-30 21:25:44 25 4
gpt4 key购买 nike

编辑:它不是列表框。我的错。这是一个 ListView 。

我有一个让我抓狂的 ListView 控件。它是一个多选列表框,因此如果用户选择 5000 行,然后通过选择单行取消选择,SelectedIndexChanged 将触发 5001 次。这会导致我的应用挂起。

我正在尝试使用线程来计算事件本应触发的次数,然后让最后一次迭代完成所有实际工作。

这是我开始时使用的代码。 大问题:由于我无法控制的项目,我需要“做花哨的计算”与调用事件在同一个线程中。

编辑:我知道这段代码不起作用。 Join() 阻塞当前线程,这否定了创建线程的全部目的。我的问题是:我该如何做这样的事情。

我最大的问题不是创建线程。这是我的“do fancy”必须在同一个线程中。



 void IncrPaintQueue()
{
绘画队列++;
线程. sleep (100);
}

int PaintQueue = 0;

private void SegmentList_SelectedIndexChanged(object sender, EventArgs e)
{
//我们需要知道这可能产生多少线程。
int MyQueue = PaintQueue;

//启动一个线程来递增计数器。
Thread Th = new Thread(IncrPaintQueue);
Th.IsBackground = true;
Th.Start();
Th.Join();

//如果我不是最后一个线程,则直接退出。
//最后一个线程将进行正确的计算。
如果(MyQueue != PaintQueue - 1)
返回;

//重置 PaintQueue 计数器。
绘画队列= 0;

//...在这里做花哨的计算...
}

最佳答案

我记得解决过这个问题 before :

A better way perhaps for you would be to put a minimal delay in your ItemSelectionChange Handler. Say -- 50ms. Use a timer, Once the selection changes, restart the timer. If the selection changed more than once within the delay period, then the original is ignored, but after the delay has expired, the logic is executed.

Like this:

public class SelectionEndListView : ListView
{
private System.Windows.Forms.Timer m_timer;
private const int SELECTION_DELAY = 50;

public SelectionEndListView()
{
m_timer = new Timer();
m_timer.Interval = SELECTION_DELAY;
m_timer.Tick += new EventHandler(m_timer_Tick);
}

protected override void OnSelectedIndexChanged(EventArgs e)
{
base.OnSelectedIndexChanged(e);

// restart delay timer
m_timer.Stop();
m_timer.Start();
}

private void m_timer_Tick(object sender, EventArgs e)
{
m_timer.Stop();

// Perform selection end logic.
Console.WriteLine("Selection Has Ended");
}
}

关于c# - 使用线程来计算 C# 事件中的循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/470201/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com