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

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

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

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.