Что такое метод замены для задачи.Беги! in.NET 4.0 с помощью C#?
Я получил эту программу, которая дает мне синтаксическую ошибку " система.Нарезка резьбы.Задачи.задача не содержит определения для выполнения."
Я использую 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;
});
}
}
}
6 ответов:
похоже
Task.Factory.StartNew<T>
это то, что вам нужно.return Task.Factory.StartNew<int>(() => { // ... return 1; });
поскольку компилятор может вывести тип возвращаемого значения, это также работает:
return Task.Factory.StartNew(() => { // ... return 1; });
прочитайте это:http://blogs.msdn.com/b/pfxteam/archive/2011/10/24/10229468.aspx
Это объясняет эту задачу.Run-это в основном хорошая обертка, представленная в 4.5.
The самый высокий проголосовал ответ, к сожалению, не совсем правильно:
к сожалению, только перегрузки для StartNew, которые принимают a TaskScheduler также требует указать CancellationToken и TaskCreationOptions. Это означает, что для использования Задача.Фабрика.StartNew надежно, предсказуемо очереди работы пул потоков, вы должны использовать перегрузку, как это:
задач.Фабрика.StartNew(A, CancellationToken.Никто, TaskCreationOptions.DenyChildAttach, TaskScheduler.По умолчанию);
Так что ближе всего к
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);
Я изменил ваш код
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; }); }
в случае, если вы используете Microsoft.Bcl.Асинхронный вот так:
return TaskEx.Run(() => { Console.WriteLine("* starting {0} work", name); Thread.Sleep(milliseconds); Console.WriteLine("* {0} work one", name); return 1; });