任务不包含Run方法的定义

kif*_*ifu 11 c# multithreading task

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

Task T = Task.Run(() => { });
Run Code Online (Sandbox Code Playgroud)

Visual Studio仍然使用语句"任务不包含定义'运行'"强调Run()

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

Mic*_*ock 19

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

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

您可以在这里了解更多信息


Mih*_*nut 7

不幸的是,是不完全正确的那个Task.Run是一样的Task.Factory.StartNew.

这个答案中,它给出了最接近Task.Run4.0的东西,如:

/// <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);
}
Run Code Online (Sandbox Code Playgroud)

可以像:

Task
    .Factory
    .StartNewOnDefaultScheduler(() => 
        result);
Run Code Online (Sandbox Code Playgroud)

但是引入的Task.Run是一个很好的包装器.Task.Factory.StartNew.NET 4.5

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

但别忘了.

你应该更喜欢Task.RunTask.Factory.StartNew,如果你使用async的代码.

本文中,Stephen Curry给出了StartNew方法危险的两个原因:

  • 不了解异步代理.
  • 令人困惑的默认调度程序.


Sco*_*ain 6

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