Что такое метод замены для задачи.Беги! 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 68

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;
});
Task.Factory.StartNew(() =>
        {
            try
            {
                Thread.Sleep(200);
                IntPtr TouchhWnd = IntPtr.Zero;
                TouchhWnd = FindWindow(null, "屏幕键盘");
                if (TouchhWnd != IntPtr.Zero)
                {
                    SetWindowPos(TouchhWnd, HWND_TOPMOST, 500, 500, 400, 300, SWP_SHOWWINDOW);
                }
            }
            catch { }
        });