it-swarm.asia

ما هي طريقة بديلة لـ Task.Run في .NET 4.0 باستخدام C #؟

حصلت على هذا البرنامج الذي يعطيني خطأ في بناء الجملة "System.Threading.Tasks.task لا يحتوي على تعريف" تشغيل "."

أنا أستخدم VB 2010 .NET 4.0 أي أفكار؟ أي بدائل لتشغيل في. صافي 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;
            });
    }
}
}
71
Ace Caserya

يبدو أن Task.Factory.StartNew<T> هو ما كنت بعد.

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

نظرًا لأن المترجم يمكنه استنتاج نوع الإرجاع ، يعمل هذا أيضًا:

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

اقرأ هذا: http://blogs.msdn.com/b/pfxteam/archive/2011/10/24/10229468.aspx

وهذا ما يفسر أن Task.Run هو في الأساس المجمع لطيفة المقدمة في 4.5.

34
NPSF3000

أعلى إجابة صوتية للأسف ، ليست بالضبط صحيحة :

لسوء الحظ ، تتطلب الأحمال الزائدة الوحيدة لـ StartNew التي تأخذ TaskScheduler أيضًا تحديد 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);
8
Eugene Podskal

لقد غيرت الشفرة باستخدام Task.Factory.StartNew check check 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;
            });
        }
5
Saroop Trivedi

في حال كنت تستخدم Microsoft.Bcl.Async هنا تذهب:

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