public void CreateTask(Task task, Action<TaskResult> callback)
 {
     ThreadStart(method: () =>
     {
         var clone = task.Clone();
         Tasks.Add(clone);
         callback(new TaskResult(new Task[] { clone }));
     });
 }
 void ITaskRepository.DeleteTask(Task task, Action<TaskResult> callback)
 {
     string uri = _BaseAddress + "tasks/" + task.Key;
     var request = WebRequest.CreateHttp(uri);
     request.Method = "DELETE";
     request.ContentType = "application/json";
     request.BeginGetResponse(result =>
     {
         var response = (HttpWebResponse)request.EndGetResponse(result);
         if (response.StatusCode != HttpStatusCode.OK)
         {
             var error = new WebException(response.StatusDescription);
             callback(new TaskResult(new Task[0], error: error));
         }
         else
         {
             callback(new TaskResult(new Task[] { task.Clone() }));
         }
     }, null);
 }
        void ITaskRepository.UpdateTask(Task task, Action<TaskResult> callback)
        {
            string uri = _BaseAddress + "tasks/" + task.Key;
            byte[] bytes = Encoding.UTF8.GetBytes(task.ToJsonString());

            var request = WebRequest.CreateHttp(uri);
            request.Method = "PUT";
            request.ContentType = "application/json";
            request.ContentLength = bytes.Length;
            request.BeginGetRequestStream(result =>
            {
                using (var stream = request.EndGetRequestStream(result))
                {
                    stream.Write(bytes, 0, bytes.Length);
                }

                request.BeginGetResponse(result2 =>
                {
                    var response = (HttpWebResponse)request.EndGetResponse(result2);
                    if (response.StatusCode != HttpStatusCode.OK)
                    {
                        var error = new WebException(response.StatusDescription);
                        callback(new TaskResult(new Task[0], error: error));
                    }
                    else
                    {
                        callback(new TaskResult(new Task[] { task.Clone() }));
                    }
                }, null);
            }, null);
        }