0

我有一个带有列表视图的表单,用户也可以添加任务。然后用户可以单击一个按钮,然后应用程序会逐个执行列表视图中的每个任务并执行它。

这些任务更像是实际完成任务的指令。我通过在其中包含一个循环的类来执行此操作,该循环遍历每个项目,然后它完成我为每个项目(指令)设置的任务。为了开始解析,我在调用该函数的表单上有一个按钮。IE: RunTask(listview1, 1) - 基本上所有这些都启动了我在课堂上的循环,指定了列表视图和从哪个项目开始。

除了屏幕锁定外,一切都很完美,所以我无法实现停止功能来阻止应用程序解析这些列表视图项目。我只是不明白如何在没有交叉线程的情况下实现这一点,因为我想单独运行的线程将始终访问此列表视图。重新设计程序以摆脱列表视图是不可行的。我尝试了 application.doevents 虽然它引起了太多人的错误。我一直在研究如何解决这个问题,但我不知道。希望有人能有所启发。

此外,我已经添加了一个后台工作人员来解决这个问题,尽管我显然必须设置 checkforillegalcrossthreadcalls = false 并且我知道这并不聪明。

4

1 回答 1

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 生锈了。

于 2012-09-05T05:11:23.237 回答