【问题标题】:Task does not contain a definition for Run method任务不包含 Run 方法的定义
【发布时间】:2018-01-20 20:32:25
【问题描述】:

我第一次尝试在我的代码中实现多线程。当我尝试使用

Task T = Task.Run(() => { });

Visual Studio 仍在用语句“任务不包含定义‘运行’”在 Run() 下划线

我正在使用 System.Threading.Tasks; 互联网对这个问题一无所知

【问题讨论】:

  • 您使用的是哪个版本的 .NET?
  • 您能否将故障隔离到最小的示例文件中,并将其添加到您的问题中,包括 .NET 版本和项目的引用?
  • 在这个项目中.NET Framework 4
  • 通过nuget添加System.Threading

标签: c# multithreading task


【解决方案1】:

.NET 4.0 没有Task.Run 方法。相反,您可以使用:

Task T = Task.Factory.StartNew(() => { });

你可以了解更多关于here的内容

【讨论】:

    【解决方案2】:

    Task.Run 是在 .NET 4.5 中引入的,您使用的是 .net 4.0。如果您无法升级您的项目,您可以包含 Microsoft.Bcl.Async NuGet 包以引入 TaskEx.Run( 以将其添加到 .net 4.0。

    【讨论】:

    • 我使用的是 .net framework 4.5 但它仍然说它不包含任何名为 Run.. 的方法。现在我升级到 4.7 仍然是同样的错误。所以它不仅仅是.net版本。它一定是别的东西。有人可以帮我吗?
    • 您需要使用完整的代码示例提出一个单独的问题,该示例可以重现我们可以复制和粘贴的问题。在dotnetfiddle.net 上重新创建问题,并在问题中包含指向代码的链接。确保你也有问题中的完整代码。
    • 啊,我刚刚想通了。我正在使用命名空间Microsoft.Exchange.WebServices.Data,其中有Task 类。所以它指的是这个任务而不是System.Threading.Tasks.Task。常见的错误。无论如何谢谢;)
    【解决方案3】:

    不幸的是,correct 不完全是 Task.RunTask.Factory.StartNew 相同。

    this 答案中,它被赋予最接近 4.0 中的 Task.Run 的东西,类似于:

    /// <summary>
    /// Starts the new <see cref="Task"/> from <paramref name="function"/> on the Default(usually ThreadPool) task scheduler (not on the TaskScheduler.Current).
    /// It is a 4.0 method nearly analogous to 4.5 Task.Run.
    /// </summary>
    /// <typeparam name="T">The type of the return value.</typeparam>
    /// <param name="factory">The factory to start from.</param>
    /// <param name="function">The function to execute.</param>
    /// <returns>The task representing the execution of the <paramref name="function"/>.</returns>
    public static Task<T> StartNewOnDefaultScheduler<T>(this TaskFactory factory, Func<T> function)
    {
        Contract.Requires(factory != null);
        Contract.Requires(function != null);
    
        return factory
            .StartNew(
                function,
                cancellationToken: CancellationToken.None,
                creationOptions: TaskCreationOptions.None,
                scheduler: TaskScheduler.Default);
    }
    

    可以这样使用:

    Task
        .Factory
        .StartNewOnDefaultScheduler(() => 
            result);
    

    但是Task.RunTask.Factory.StartNew 的一个很好的包装器,在.NET 4.5 中引入。

    但是对于您的情况,当您需要它进行multithreading 操作时,只需使用它即可。

    但不要忘记。

    如果您使用async 代码,您应该更喜欢Task.Run 而不是Task.Factory.StartNew

    在这个 article 中,Stephen Curry 给出了 StartNew 方法危险的两个原因:

    • 不理解异步委托。
    • 令人困惑的默认调度程序。

    【讨论】:

    • Contract 的世界是什么? The name 'Contract' does not exist in the current context
    猜你喜欢
    • 2017-07-08
    • 2017-03-31
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多