【问题标题】:Call to TaskFactory.StartNew() with parameters errors with "reference to non-shared member requires an object reference "使用“对非共享成员的引用需要对象引用”的参数错误调用 TaskFactory.StartNew()
【发布时间】:2025-12-16 10:15:01
【问题描述】:

代码段在第 7 行有错误“对非共享成员的引用需要对象引用”。我正在使用 MS 示例来解决这个问题,所以它应该可以工作。谢谢!

Sub main()
    Dim TokenSource As New CancellationTokenSource()
    Dim token As CancellationToken = TokenSource.Token
    Dim TaskX As Task
    Dim tasks As New ConcurrentBag(Of Task)()
    MessageBox.Show("In Module taskStore running Main subroutine")
    TaskX = TaskFactory.StartNew(Sub() DoSomeWork(1, token), token)
    tasks.Add(t)
End Sub

Sub DoSomeWork(ByVal taskNum As Integer, ByVal ct As CancellationToken)
    If ct.IsCancellationRequested = True Then
        MessageBox.Show("TaskX cancelled before it got started")
        ct.ThrowIfCancellationRequested()
    End If
    Dim maxIterations As Integer = 100

End Sub

【问题讨论】:

  • Dim factory As New TaskFactory / factory.StartNew(...)
  • 你能链接到这个“MS示例”吗?
  • 知道了!谢谢你,汉斯!
  • 该示例使用 C#,而不是 VB.NET。与其尝试将每个示例和 Github 项目都转换为 VB.NET,不如改用 C#。尽管微软做出了努力,开发人员还是放弃了 VB.NET,因此最终甚至微软也停止发布两种语言的示例。这就是为什么您在 VB.NET 中找不到文档或示例的原因。不是因为 MS 放弃了它(所有文档都使用这两种语言将近 20 年),而是因为 developers 已经在 2012 年放弃了它。此外,您需要了解 C# 才能将代码转换为 VB.NET

标签: vb.net visual-studio-2017 task-parallel-library taskfactory


【解决方案1】:

您链接到的示例使用:

t = Task.Factory.StartNew(Sub() DoSomeWork(1, token), token)

不是

t = TaskFactory.StartNew(Sub() DoSomeWork(1, token), token)

Task.Factory 属性返回一个默认的 TaskFactory 实例,可用于调用 StartNew 对象方法。

自 2012 年引入 Async/AwaitTask.Run 以来,该方法不再使用。 the docs as well 中对此进行了解释:

从 .NET Framework 4.5 开始,Task.Run 方法提供了使用默认配置值创建 Task 对象的最简单方法。

目前支持的最旧的 .NET Framework 版本是 4.5.2,但即便如此,go out of support in April 2022 也将在短短 3 个月内完成。您的代码至少应该针对 4.6.2,尽管 4.7.1 或 4.8 会更好

【讨论】:

    最近更新 更多