什么是使用C#的.NET 4.0中Task.Run的替换方法?

Ace*_*rya 73 .net c# asynchronous task-parallel-library

我得到了这个程序,它给我语法错误"System.Threading.Tasks.task不包含Run的定义."

我正在使用VB 2010 .NET 4.0任何想法?在.net 4.0中运行的任何替换?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace ChatApp
{
class ChatProg
{
    static void Main(string[] args)
    {
        Task<int> wakeUp = DoWorkAsync(2000,"Waking up");
        Task.WaitAll(wakeUp);
    }

    static Task<int> DoWorkAsync(int milliseconds, string name)
    {

        //error appears below on word Run
        return Task.Run(() =>
            {
                Console.WriteLine("* starting {0} work", name);
                Thread.Sleep(milliseconds);
                Console.WriteLine("* {0} work one", name);
                return 1;
            });
    }
}
}
Run Code Online (Sandbox Code Playgroud)

McG*_*gle 85

看起来就像Task.Factory.StartNew<T>是你所追求的.

return Task.Factory.StartNew<int>(() => {
    // ...
    return 1;
});
Run Code Online (Sandbox Code Playgroud)

由于编译器可以推断返回类型,这也有效:

return Task.Factory.StartNew(() => {
    // ...
    return 1;
});
Run Code Online (Sandbox Code Playgroud)

  • 重要的是要知道此代码与Task.Run的行为不同. (4认同)
  • @Henryyottabyte是的,显然是:http://msdn.microsoft.com/en-us/library/system.threading.tasks.task.run.aspx (3认同)
  • 添加到答案是我找到的这个链接.http://blogs.msdn.com/b/pfxteam/archive/2011/10/24/10229468.aspx (3认同)
  • 运行.NET 4.5功能吗? (2认同)

NPS*_*000 34

阅读本文:http: //blogs.msdn.com/b/pfxteam/archive/2011/10/24/10229468.aspx

它解释了Task.Run基本上是4.5中引入的一个很好的包装器.


Eug*_*kal 9

最高的投票答案,不幸的是,是不完全正确的:

不幸的是,使用TaskScheduler的StartNew的唯一重载也要求您指定CancellationToken和TaskCreationOptions.这意味着为了使用Task.Factory.StartNew可靠,可预测地将工作排队到线程池,您必须使用如下的重载:

Task.Factory.StartNew(A,CancellationToken.None,TaskCreationOptions.DenyChildAttach,TaskScheduler.Default);

所以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)


Sar*_*edi 5

我通过Task.Factory.StartNew检查详细信息链接更改了您的代码

 static Task<int> DoWorkAsync(int milliseconds, string name)
        {


            //error appears below on word Run
            return   Task.Factory.StartNew(() =>
            {
                Console.WriteLine("* starting {0} work", name);
                Thread.Sleep(milliseconds);
                Console.WriteLine("* {0} work one", name);
                return 1;
            });
        }
Run Code Online (Sandbox Code Playgroud)