.NET 4.0 имеет TPL, который содержит класс Task, для инкапсуляции моделей асинхронного программирования. Я работаю над приложением, которое должно быть .NET 2.0, но я хочу избежать перезаписи задачи. Любые предложения?
Что делать, чтобы использовать Task <T> в .NET 2.0?
Ответ 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.
К сожалению