在这种情况下如何实现多线程?可能吗?

时间:2012-09-05 02:46:46

标签: vb.net multithreading visual-studio-2010 backgroundworker

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

这些任务更像是实际完成任务的指令。我这样做是通过让一个带有循环的类来遍历每个项目,然后完成我为每个项目(指令)设置的任务。为了开始解析,我在一个调用该函数的表单上有一个按钮。 IE:RunTask(listview1,1) - 基本上所有这一切都会启动我在我的类中的循环,具有指定的列表视图以及要启动的项目。

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

此外,我已经添加了一个后台工作者来解决这个问题,虽然我必须设置checkforillegalcrossthreadcalls = false,我知道这不聪明。

1 个答案:

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