// Моя библиотека методов, которые могу выполняться очень долго
// Они принимают и возвращают различные типы данных
public string Method1 (int x) {...}
public int Method2 (string x) {...}
public long Method3 (bool x) {...}
// Это то, как я их хочу хранить
List<MyJob> _jobs = new List<MyJob>();
// Это методы, которые реализует интерфейс сервиса WCF
// Добавляем задание
public Status NewMegaWork(string x)
{
string id = newJobId;
_jobs.Add(new MyJob(id, Method1(x)));
return new Status {Id = id};
}
// Получаем результат c уже выполненным методом.
public string GetMegaWork(string id)
{
return _job.Where(x => x.Id = id).First();
}
public interface ILongTermJob<T>
{
string Id { get; }
bool IsCompleted { get; }
T Result { get; }
}
public interface ILongTermJob<T>
{
string Id { get; }
bool IsCompleted { get; }
T Result { get; }
}
public class LongTermJob<T> : ILongTermJob<T>
{
private readonly Task<T> _task;
private readonly string _id;
public delegate T Method();
public string Id
{
get { return _id; }
}
public bool IsCompleted
{
get { return _task.IsCompleted; }
}
public T Result
{
get { return _task.Result; }
}
public LongTermJob(string id, Method method)
{
_id = id;
_task = Task.Factory.StartNew(() => method());
}
}
Косяки возникают при плохой связи: прочитал 30 страниц в метро, он данные на сервер не отправил (связи нет) и приложение закрыл -> вечером опять в метро открываешь, читаешь дальше, на какой то станции связь появилась, он синхронизируется с сервером... хоп! -> ты на минус 30 + сколько прочитал страниц.
Но всё реже и реже такая ситуация. Было бы идеально, конечно, если бы он спрашивал перед синхронизацией, особенно перед синхронизацией назад.