我有一个应用程序,用户提供要由线程处理的数据,然后线程将数据返回到UI中。 用户可以通过启动另一个线程来更改输入。如何正确忽略旧的返回线程?
我注意到通常有两种解决方案。 1)在调用中检查当前输入数据是否与线程使用的相同 2)等待第一个线程结束后再启动另一个线程
第一种解决方案可行,但如果用户再次更改输入为相同的值,则仍可能使用较旧的线程,并且我会得到两个或更多刷新UI的相同数据 第二个选项响应速度较慢,特别是当线程中的计算运行时间较长时,因为我们必须等待每个线程完成其工作。
我创建了下面的解决方案,我想知道它是否是处理它的适当方式,或者我需要添加其他检查或锁定。
我注意到通常有两种解决方案。 1)在调用中检查当前输入数据是否与线程使用的相同 2)等待第一个线程结束后再启动另一个线程
第一种解决方案可行,但如果用户再次更改输入为相同的值,则仍可能使用较旧的线程,并且我会得到两个或更多刷新UI的相同数据 第二个选项响应速度较慢,特别是当线程中的计算运行时间较长时,因为我们必须等待每个线程完成其工作。
我创建了下面的解决方案,我想知道它是否是处理它的适当方式,或者我需要添加其他检查或锁定。
private Thread lastThread;
private void ButtonClick(object sender, MouseButtonEventArgs e)
{
this.lastThread= new Thread(delegate () { Update(someData); });
this.lastThread.Start();
}
private void Update(int someData) {
Thread currThread = Thread.CurrentThread;
Application.Current.Dispatcher.Invoke(new Action(() => EndUpdate(
someDataCalculated,
currThread
)));
private void EndUpdate(int someDataCalculated, Thread senderThread) {
if (senderThread == this.lastThread)
{
// right thread, do some work in UI
}
}