我有一个带有listview的表单,用户也可以添加任务。然后用户可以单击一个按钮,然后应用程序通过列表视图1中的每个任务执行它。
这些任务更像是实际完成任务的指令。我这样做是通过让一个带有循环的类来遍历每个项目,然后完成我为每个项目(指令)设置的任务。为了开始解析,我在一个调用该函数的表单上有一个按钮。 IE:RunTask(listview1,1) - 基本上所有这一切都会启动我在我的类中的循环,具有指定的列表视图以及要启动的项目。
除了屏幕锁定之外,一切都很完美,因此我无法实现停止功能来阻止应用程序解析这些listview项目。我只是不明白如何在没有交叉线程的情况下实现这一点,因为我想单独运行的线程将始终访问此列表视图。重新设计程序以摆脱列表视图是不可行的。我尝试过application.doevents虽然它引起了人们的错误。我一直在研究如何解决这个问题,但我不知道。希望有人可以听取一些消息。
此外,我已经添加了一个后台工作者来解决这个问题,虽然我必须设置checkforillegalcrossthreadcalls = false,我知道这不聪明。
答案 0 :(得分:0)
尝试做这样的事情。带您列出视图并将其转换为一组与UI无关的值。像这样:
string[] values =
this
.listView1
.Items
.Cast<ListViewItem>()
.Select(x => x.Text)
.ToArray();
然后,您可以使用并行任务库在后台运行任务:
var tokenSource = new System.Threading.CancellationTokenSource();
var token = tokenSource.Token;
var task = System.Threading.Tasks.Task.Factory
.StartNew(() => RunTasks(values, 1), token);
如果您需要取消任务,可以执行以下操作:
tokenSource.Cancel();
但要在任务完成时处理UI更新,请执行以下操作:
task.ContinueWith(r =>
{
/* When compete code */
});
确保您调用UI更新,以便它们在UI线程上运行。
我很抱歉我没有在VB.NET中写这个。我的VB生锈了。