gpt4 book ai didi

vb.net - 线程异常 : The number of WaitHandles must be less than or equal to 64

转载 作者:行者123 更新时间:2023-12-04 18:19:48 24 4
gpt4 key购买 nike

标题是为了让其他有此错误的人更容易找到它。我是 Threading 的新手,所以这真的让我见怪不怪。我收到了导致 Cassini 崩溃的运行时错误。这是我最初在 VS 2003 中作为网站项目开发并转换为 VS 2008 网站项目的代码。

重要信息:

  • manualEvents 中的对象数在这种情况下,数组是 128。
  • products是一个字符串数组
  • 需要支持.NET 2.0

  • For Each product As String In products
    If Not product.Trim().ToUpper().EndsWith("OBSOLETE") Then
    calls += 1
    End If
    Next
    Dim results(calls - 1) As DownloadResults
    'Dim manualEvents(calls - 1) As Threading.ManualResetEvent '128 objects in this case.
    Dim manualEvents(0) As Threading.ManualResetEvent
    manualEvents(0) = New Threading.ManualResetEvent(False)
    'NOTE: I don't think this will work because what is not seen here, is that
    ' this code is being used to populate and cache a long list of products,
    ' each with their own category, etc. Am I misunderstanding something?

    'initialize results structures
    'spawn background workers
    calls = 0
    For Each product As String In products
    If Not product.Trim().ToUpper().EndsWith("OBSOLETE") Then
    Dim result As New DownloadResults

    'manualEvents(calls) = New Threading.ManualResetEvent(False)
    'Moved above For Each after declaration of variable

    result.params.product = product
    result.params.category = docType
    'result.ManualEvent = manualEvents(calls)
    result.ManualEvent = manualEvents(0)
    result.Context = Me._context

    results(calls) = result

    Threading.ThreadPool.QueueUserWorkItem(AddressOf ProcessSingleCategoryProduct, results(calls))
    Threading.Interlocked.Increment(calls) 'Replaces below incrementation

    'calls += 1
    End If
    Next

    Threading.WaitHandle.WaitAll(manualEvents) 'CRASHES HERE

    线程辅助函数(为了完成)

    Public Shared Sub ProcessSingleCategoryProduct(ByVal state As Object)
    Dim drs As DownloadResults = CType(state, DownloadResults)
    Dim adc As New cADCWebService(drs.Context)

    drs.docs = adc.DownloadADC(drs.params.category, drs.params.product)
    drs.ManualEvent.Set()
    End Sub

    最佳答案

    您不需要包含 128 个手动事件的数组来检查所有 128 个线程是否完成。

    仅创建一个手动重置事件和一个从 128 开始的普通整数。使用 Interlocked.Decrement 递减该整数在 ProcessSingleCategoryProduct 结尾,并且仅在计数达到零时发出事件信号:

    if (Interlocked.Decrement(ByRef myCounter) = 0) myEvent.Set();

    然后只声明一个 Threading.ManualResetEvent而不是它们的数组,您可以调用 WaitOne而不是 WaitAll就可以了,你就完成了。

    如果您有 .NET 4,另请参阅 usr 的评论以获得更简单的替代方案。

    关于vb.net - 线程异常 : The number of WaitHandles must be less than or equal to 64,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10905016/

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