76

「System.Threading.Tasks.taskにRunの定義が含まれていません」という構文エラーが発生するこのプログラムを取得しました。

VB 2010 .NET 4.0 を使用しています。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

4 に答える 4

10

残念ながら、最も投票された回答は正確には正しくありません。

残念ながら、TaskScheduler を取る StartNew の唯一のオーバーロードでは、CancellationToken と TaskCreationOptions も指定する必要があります。これは、Task.Factory.StartNew を使用して確実に予測どおりに作業をスレッド プールにキューに入れるために、次のようなオーバーロードを使用する必要があることを意味します。

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

Task.Runしたがって、 4.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);
于 2017-01-30T16:01:39.930 に答える
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;
            });
        }
于 2013-07-12T03:53:27.423 に答える