private void UploadPhoto(Stream photoStream, string getServerMethodName, Dictionary <string, string> parameters, string saveMethodName, bool saveReturnsList, Action <VKBackendResult <VKPhoto> > callback, Action <double> progressCallback) { var vkParams = new VKRequestParameters(getServerMethodName, parameters); var getServerRequest = new VKRequest(vkParams); getServerRequest.Dispatch <VKUploadServerAddress>( (res) => { if (res.ResultCode == VKResultCode.Succeeded) { var uploadUrl = res.Data.upload_url; VKHttpRequestHelper.Upload( uploadUrl, photoStream, "file1", "image", (uploadRes) => { if (uploadRes.IsSucceeded) { var serverPhotoHashJson = uploadRes.Data; var uploadData = JsonConvert.DeserializeObject <VKUploadResponseData>(serverPhotoHashJson); if (!string.IsNullOrWhiteSpace(uploadData.server)) { parameters["server"] = uploadData.server; } if (!string.IsNullOrWhiteSpace(uploadData.photos_list)) { parameters["photos_list"] = uploadData.photos_list; } if (!string.IsNullOrWhiteSpace(uploadData.hash)) { parameters["hash"] = uploadData.hash; } if (!string.IsNullOrWhiteSpace(uploadData.photo)) { parameters["photo"] = uploadData.photo; } var saveWallPhotoVKParams = new VKRequestParameters(saveMethodName, parameters); var saveWallPhotoRequest = new VKRequest(saveWallPhotoVKParams); saveWallPhotoRequest.Dispatch( callback, (jsonStr) => { if (saveReturnsList) { var resp = JsonConvert.DeserializeObject <GenericRoot <List <VKPhoto> > >(jsonStr); return(resp.response.First()); } else { var resp = JsonConvert.DeserializeObject <GenericRoot <VKPhoto> >(jsonStr); return(resp.response); } }); } else { callback(new VKBackendResult <VKPhoto> { ResultCode = VKResultCode.UnknownError }); } }, progressCallback, "Image.jpg"); } else { callback(new VKBackendResult <VKPhoto> { ResultCode = res.ResultCode, Error = res.Error }); } }); }