Що таке метод заміни Task.Run в .NET 4.0 за допомогою C #?


74

Я отримав цю програму, яка видає мені синтаксичну помилку "System.Threading.Tasks.task не містить визначення для запуску."

Я використовую 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;
            });
    }
}
}

4
Спробуйте це Task.Factory.StartNew () Будь ласка, зверніться до посилання нижче: blogs.msdn.com/b/pfxteam/archive/2011/10/24/10229468.aspx
Saroop Trivedi

я отримав ту саму проблему, але проблема в тому, що вона ризикує, поки я читаю про цю проблему, тому чи добре вирізати нитки, вибираємо ??? якщо так, будь ласка, надайте мені детальний приклад про створення потоків, тому що це моя перша робота з потоком
Sam

Відповіді:


88

Схоже, Task.Factory.StartNew<T>це те, за чим ви шукаєте.

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

Оскільки компілятор може вивести тип повернення, це також працює:

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

2
Чи є запуск функції .NET 4.5?
Ace Caserya

3
@Henryyottabyte так, мабуть: msdn.microsoft.com/en-us/library/…
McGarnagle

3
додавши до відповіді це посилання, яке я знайшов. blogs.msdn.com/b/pfxteam/archive/2011/10/24/10229468.aspx
Ace Caserya

1
Це схоже на Task :: Factory-> StartNew у C ++ / CLI
Мирослав Недялков

5
Важливо знати, що цей код не поводиться ідентично Task.Run.
usr

10

Найбільше кількість голосів відповіді , на жаль, це не зовсім правильно :

На жаль, єдині перевантаження для StartNew, які приймають TaskScheduler, також вимагають, щоб ви вказали 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);
}

які можна використовувати як:

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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.