Подтвердить что ты не робот

Что делать, чтобы использовать Task <T> в .NET 2.0?

.NET 4.0 имеет TPL, который содержит класс Task, для инкапсуляции моделей асинхронного программирования. Я работаю над приложением, которое должно быть .NET 2.0, но я хочу избежать перезаписи задачи. Любые предложения?

4b9b3361

Ответ 1

Я знаю, что вы сказали, что не хотите переписывать Task, но вы можете создать что-то довольно простое с помощью закрытий, которое ведет себя как объект Task. Это то, что я использую:

    public delegate R AsyncTask<R>();

    public static AsyncTask<R> BeginTask<R>(AsyncTask<R> function)
    {
        R retv = default(R);
        bool completed = false;

        object sync = new object();

        IAsyncResult asyncResult = function.BeginInvoke(
                iAsyncResult =>
                {
                    lock (sync)
                    {
                        completed = true;
                        retv = function.EndInvoke(iAsyncResult);
                        Monitor.Pulse(sync); 
                    }
                }, null);

        return delegate
        {
            lock (sync)
            {
                if (!completed)               
                {
                    Monitor.Wait(sync); 
                }
                return retv;
            }
        };
    }

Его функция, которая вызывает BeginInvoke() на делетете, который вы передаете, и возвращает функцию, которая при вызове блоков и ждет результата переданной функции. Вам придется создавать перегрузки этой функции для другого метода подписи, конечно.

Один из способов пойти, вы можете настроить это на свои нужды и добавить другие варианты поведения, такие как Continuations и т.д. Ключом является использование закрытий и анонимных делегатов. Должен работать в .NET 2.0.

ИЗМЕНИТЬ. Вот как вы его используете:

    public static string HelloWorld()
    {
        return "Hello World!"; 
    }

    static void Main(string[] args)
    {
        var task = BeginTask(HelloWorld); // non-blocking call

        string result = task(); // block and wait

    }

Ответ 2

Вам нужно будет использовать класс System.Threading.Thread, вы можете получить класс Task для .net 3.5, но не для .net 2.

К сожалению