gpt4 book ai didi

vb.net - 任务正在运行,无法完成

转载 作者:行者123 更新时间:2023-12-01 06:07:19 25 4
gpt4 key购买 nike

在我未完成的任务中有奇怪的行为。我一直在使用它,但我想这是因为我传递给它的 sub 正在使用表单进行迭代 - 更改选择并刷新某些列表框可能因此它的堆栈在那里,但我不确定。让我们看看代码:

这是我想在任务中运行的子程序:

    Public Sub UnselectExistingConnectionsItems()
Dim SentenceId, SubSubKategorieId, SubSectionId As Integer
SubSectionId = CbSubSections.SelectedValue 'combobox
If WithSubSubkategorie = SubSubKategorieEnum.Without Then
SubSubKategorieId = 0
Else
SubSubKategorieId = CbSubSubKategorie.SelectedValue 'combobox
End If
Unselect:
For i As Integer = 0 To LB_Sentences.SelectedItems.Count - 1
Dim sKey As ListBoxItem
sKey = LB_Sentences.SelectedItems(i)
SentenceId = HtmlDescription.HtmlSentence.GetSentenceIdByName(sKey.Text)
If HtmlDescription.HtmlSubSubSections_Sentences.CheckIfConnectionAlreadyExist(SentenceId, SubSectionId, SubSubKategorieId) Then
sKey.IsSelected = False
LB_Sentences.Refresh()
GoTo Unselect
End If
Next
End Sub

我把它放在这样的任务中:
Dim pic As New FrmCircularProgress(eCircularProgressType.Line)
Dim work As Task = Task.Factory.StartNew(Sub()
'--Run lenghty task UnselectExistingConnectionsItems()
'--Close form once done (on GUI thread)
pic.Invoke(New Action(Sub() pic.StopCircular()))
pic.Invoke(New Action(Sub() pic.Close()))
End Sub)

'--Show the form
pic.ShowDialog()
Task.WaitAll(work)

和 FrmCircularProgress 只是形式(我几乎在所有需要用户等待的地方都使用它,除了这种特殊情况外,它的工作原理):
Public Class FrmCircularProgress
Sub New(progressType As DevComponents.DotNetBar.eCircularProgressType)
InitializeComponent()
CircularProgress1.ProgressBarType = progressType
StartCircular()
End Sub

Public Sub StartCircular()
Me.CircularProgress1.IsRunning = True
End Sub

Public Sub StopCircular()
Me.CircularProgress1.IsRunning = False
End Sub
End Class

有什么问题?是因为程序正在与列表框和组合框交互吗?如果是这样如何解决这个问题,我读了一些关于调用列表框和组合框的内容,但不知道如何解决这个问题。

编辑:
我认为除了这些行:
sKey.IsSelected = False
LB_Sentences.Refresh()

我必须做这些:
  LB_Sentences.Invoke(Sub()  sKey.IsSelected = False
End Sub)
LB_Sentences.Invoke(Sub() LB_Sentences.Refresh()
End Sub)

因为我在不同的线程中。不知何故,我不知道如何转换这些行:
 SubSectionId = CbSubSections.SelectedValue
SubSubKategorieId = CbSubSubKategorie.SelectedValue

可能还必须调用循环。等待你的帮助。

最佳答案

有一条规则说“唯一可以修改窗口中控件的线程是创建窗口的线程”。任何其他线程尝试修改窗口中的某些内容都会产生跨线程调用异常。

所以在你的第一次编辑中你做对了,你必须调用函数。

但是,这并不能解决您未完成 Task 的问题。

相信做sKey.IsSelected = False不会取消选择 ListBox 中的任何内容,因此会导致无限循环...还有 Goto语句是非常不好的编程习惯,不应该使用。总有另一种解决方案可以使您的代码更易于调试/维护/阅读...
ListBoxItem不是 .Net Framework 中存在的类型。所以要么你创建了那个类要么是别的东西(我不知道是什么......)

您可以做些什么来解决您的问题:

  • 获取列表中所有选定项的索引
  • 浏览您的列表,并检查是否应选择它们:
  • 如果他们应该被选中,什么都不做
  • 如果它们不应该,取消选择它们。

  • 这使您的代码像这样(并且您删除了代码中不想要的丑陋 Label 和 Goto)...
    Public Sub UnselectExistingConnectionsItems()
    Dim SentenceId, SubSubKategorieId, SubSectionId As Integer
    SubSectionId = CbSubSections.SelectedValue 'combobox
    If WithSubSubkategorie = SubSubKategorieEnum.Without Then
    SubSubKategorieId = 0
    Else
    SubSubKategorieId = CbSubSubKategorie.SelectedValue 'combobox
    End If

    'We create an array to remind our initial selection
    Dim sel = New Integer(LB_Sentences.SelectedItems.Count - 1) {}
    LB_Sentences.SelectedIndices.CopyTo(sel, 0)

    For i = 0 To sel.Length - 1
    Dim sKey As ListBoxItem
    'We get our selected item
    sKey = LB_Sentences(sel(i))
    SentenceId = HtmlDescription.HtmlSentence.GetSentenceIdByName(sKey.Text)
    If HtmlDescription.HtmlSubSubSections_Sentences.CheckIfConnectionAlreadyExist(SentenceId, SubSectionId, SubSubKategorieId) Then
    'We must remove it from the selection
    LB_Sentences.Invoke(Sub() LB_Sentences.SelectedItems.Remove(sKey))
    End If
    Next
    'We do the Refresh at the end so we gain some process time...
    LB_Sentences.Invoke(Sub() LB_Sentences.Refresh())
    End Sub

    关于vb.net - 任务正在运行,无法完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36980958/

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