What is a replacement method for Task.Run in .NET 4.0 using C#?

51,433

Solution 1

It looks like Task.Factory.StartNew<T> is what you're after.

return Task.Factory.StartNew<int>(() => {
    // ...
    return 1;
});

Since the compiler can infer the return type, this also works:

return Task.Factory.StartNew(() => {
    // ...
    return 1;
});

Solution 2

The highest voted answer, unfortunately, is not exactly correct:

Unfortunately, the only overloads for StartNew that take a TaskScheduler also require you to specify the CancellationToken and TaskCreationOptions. This means that in order to use Task.Factory.StartNew to reliably, predictably queue work to the thread pool, you have to use an overload like this:

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

So the closest thing to Task.Run in 4.0 is something like:

/// <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);
}

that can be used like:

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

Solution 3

I changed your code with Task.Factory.StartNew check detail link

 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;
            });
        }

Solution 4

In case you're using Microsoft.Bcl.Async here you go:

return TaskEx.Run(() =>
{
    Console.WriteLine("* starting {0} work", name);
    Thread.Sleep(milliseconds);
    Console.WriteLine("* {0} work one", name);
    return 1;
});
Share:
51,433
Ace Caserya
Author by

Ace Caserya

IT Knowledge: Management, IT Policies, Networks, Q.A., System/ERP Developer, and Basic Web Development.

Updated on July 05, 2022

Comments

  • Ace Caserya
    Ace Caserya almost 2 years

    I got this program that gives me syntax error "System.Threading.Tasks.task does not contain a definition for Run."

    I am using VB 2010 .NET 4.0 Any ideas? any replacements for Run in .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;
                });
        }
    }
    }
    
  • Ace Caserya
    Ace Caserya almost 11 years
    Is Run a .NET 4.5 feature?
  • McGarnagle
    McGarnagle almost 11 years
    @Henryyottabyte yes, apparently: msdn.microsoft.com/en-us/library/…
  • Ace Caserya
    Ace Caserya almost 11 years
    adding to the answer is this link i found. blogs.msdn.com/b/pfxteam/archive/2011/10/24/10229468.aspx
  • Miroslav Nedyalkov
    Miroslav Nedyalkov over 9 years
    It looks like Task::Factory->StartNew in C++/CLI
  • usr
    usr almost 8 years
    It's important to know that this code does not behave identically to Task.Run.