Was ist eine Ersatzmethode für Task.Run in .NET 4.0 mit C #?

74

Ich habe dieses Programm erhalten, das mir den Syntaxfehler "System.Threading.Tasks.task enthält keine Definition für Ausführen" gibt.

Ich verwende VB 2010 .NET 4.0 Irgendwelche Ideen? Gibt es Ersatz für 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
quelle
4
Versuchen Sie dies Task.Factory.StartNew () Bitte beziehen Sie sich auf den folgenden Link: blogs.msdn.com/b/pfxteam/archive/2011/10/24/10229468.aspx
Saroop Trivedi
Ich habe das gleiche Problem, aber das Problem, dass es ein Risiko hat, während ich über dieses Problem lese, ist Threading gut wählen insted? Wenn ja, geben Sie mir bitte ein detailliertes Beispiel zum Threading, da ich zum ersten Mal mit Thread arbeite
sam

Antworten:

88

Es sieht so aus, als ob Task.Factory.StartNew<T>Sie danach suchen.

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

Da der Compiler auf den Rückgabetyp schließen kann, funktioniert dies auch:

return Task.Factory.StartNew(() => {
    // ...
    return 1;
});
McGarnagle
quelle
2
Wird eine .NET 4.5-Funktion ausgeführt?
Ace Caserya
3
@ Henryyottabyte ja, anscheinend: msdn.microsoft.com/en-us/library/…
McGarnagle
3
Der Antwort wird dieser Link hinzugefügt, den ich gefunden habe. blogs.msdn.com/b/pfxteam/archive/2011/10/24/10229468.aspx
Ace Caserya
1
Es sieht aus wie Task :: Factory-> StartNew in C ++ / CLI
Miroslav Nedyalkov
5
Es ist wichtig zu wissen, dass sich dieser Code nicht identisch mit Task.Run verhält.
usr
10

Die Antwort mit der höchsten Stimme ist leider nicht genau richtig :

Leider müssen Sie für die einzigen Überladungen für StartNew, die einen TaskScheduler benötigen, auch die Optionen CancellationToken und TaskCreationOptions angeben. Dies bedeutet, dass Sie eine Überladung wie die folgende verwenden müssen, um Task.Factory.StartNew zu verwenden, um die Arbeit zuverlässig und vorhersehbar in die Warteschlange des Thread-Pools zu stellen:

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

Das nächste Task.Runin 4.0 ist also so etwas wie:

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

das kann verwendet werden wie:

Task
    .Factory
    .StartNewOnDefaultScheduler(() => 
        result);
Eugene Podskal
quelle
5

Ich habe Ihren Code mit Task.Factory.StartNewCheck Detail Link geändert

 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;
            });
        }
Saroop Trivedi
quelle
3

Wenn Sie Microsoft.Bcl.Async verwenden, klicken Sie hier:

return TaskEx.Run(() =>
{
    Console.WriteLine("* starting {0} work", name);
    Thread.Sleep(milliseconds);
    Console.WriteLine("* {0} work one", name);
    return 1;
});
Karmakulov Kirill
quelle