المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : How to use 4 background workers to show upload status



C# Programming
07-10-2009, 05:51 PM
Hi,

I have an application in which I want to upload some values, signatures and photos to the server.I want to show 4 progress bars. Some values, signatures and photos upload status on their own progress bar. 4th progress bar will show the status of all above 3 uploads collectively.

I am posting a method where I have code for it.

private void UploadServiceValuesPhotosAndSignature()
{
bool[] allResponses;
List signatures = null;

foreach (var serviceInstance in serviceInstances)
{
//Get All Signatures
signatures = serviceValues.Select(sv => sv.Signature).Distinct().ToList();

//Get All Photos
allPhotosToUpload = PostPhotoCollection.GetPhotos(serviceInstance, context);
int count = allPhotosToUpload.Count + signatures.Count + 1;
allResponses = new bool[count];

int i = 0;

//Upload serviceValues
serviceValuesWorker = new BackgroundWorker();
serviceValuesWorker.WorkerReportsProgress = true;
serviceValuesWorker.WorkerSupportsCancellation = true;

serviceValuesWorker.DoWork += delegate(object s, DoWorkEventArgs args)
{
serviceValuesWorker.ReportProgress(10);
if (serviceValuesWorker.CancellationPending)
{
args.Cancel = true;
return;
}
serviceValuesWorker.ReportProgress(50);

//serviceValuesWorker doing its work

var serializableValues = serviceInstance.ServiceValues.AsSerializable();
var serialisedValues = new Dictionary { { "ValuesInfo", serializableValues } }.Serialize();
string responseFromServer = ServiceRequest.GetResponse("UpdateServiceInstanceMobile", "ServiceInstances", serialisedValues, serviceInstance.ServiceInstanceID.ToString());
var response = responseFromServer.Deserialize>();
bool successServiceValues = (bool)response["success"];
if (successServiceValues)
{
serviceValuesWorker.ReportProgress(100);
}
args.Result = successServiceValues;
};
serviceValuesWorker.ProgressChanged += delegate(object s, ProgressChangedEventArgs args)
{
serviceValuesProgressBar.Value = args.ProgressPercentage;
};
serviceValuesWorker.RunWorkerCompleted += delegate(object s, RunWorkerCompletedEventArgs args)
{
//serviceValuesWorker modifying the allResponses array
allResponses[i++] = (bool) args.Result;

};
serviceValuesWorker.RunWorkerAsync();

//Upload Signatures
signatureWorker = new BackgroundWorker();
signatureWorker.WorkerReportsProgress = true;
signatureWorker.WorkerSupportsCancellation = true;

signatureWorker.DoWork += delegate(object s, DoWorkEventArgs args)
{
signatureWorker.ReportProgress(10);
if (signatureWorker.CancellationPending)
{
args.Cancel = true;
return;
}
signatureWorker.ReportProgress(50);

//signatureWorker doing its work

bool[] responseArray = new bool[signatures.Count];
int j = 0;
foreach (var signature in signatures)
{
string signaturePath = signature.SignaturePath;
byte[] signatureByteArray = SignatureFileConversion.SignatureFileToByteArray(signaturePath);
string signatureToUpload = signatureByteArray.Serialize();
var signatureResponseFromServer = ServiceRequest.GetSignatureResponse("AddSignature", "ServiceInstances", serviceValuesString, serviceInstance.ServiceInstanceID.ToString(), signatureToUpload);
var signatureResponse = signatureResponseFromServer.Deserialize>();
responseArray[j++] = (bool)signatureResponse["success"];
}
}
if(!responseArray.Contains(false))
{
signatureWorker.ReportProgress(100);
}
args.Result = responseArray;
};
signatureWorker.ProgressChanged += delegate(object s, ProgressChangedEventArgs args)
{
signatureProgressBar.Value = args.ProgressPercentage;
};
signatureWorker.RunWorkerCompleted += delegate(object s, RunWorkerCompletedEventArgs args)
{
bool[] signatureResponses = (bool[]) args.Result;
foreach (var response in signatureResponses)
{
//modifying the allResponses array

allResponses[i++] = response;
}

};
signatureWorker.RunWorkerAsync();

//Upload Photos
photoWorker = new BackgroundWorker();
photoWorker.WorkerReportsProgress = true;
photoWorker.WorkerSupportsCancellation = true;

photoWorker.DoWork += delegate(object s, DoWorkEventArgs args)
{
photoWorker.ReportProgress(10);
if (photoWorker.CancellationPending)
{
args.Cancel = true;
return;
}
photoWorker.ReportProgress(50);

//photoWorker doing its work

bool[] photoResponseArray = new bool[allPhotosToUpload.Count];
int k = 0;
foreach (var photo in allPhotosToUpload)
{
photoResponseArray[k++] = PostPhotoCollection.SendPhoto(photo);
}
if(!photoResponseArray.Contains(false))
{
photoWorker.ReportProgress(100);
}
args.Result = photoResponseArray;
};
photoWorker.ProgressChanged += delegate(object s, ProgressChangedEventArgs args)
{
serviceValuesProgressBar.Value = args.ProgressPercentage;
};
photoWorker.RunWorkerCompleted += delegate(object s, RunWorkerCompletedEventArgs args)
{
bool[] photoResponses = (bool[]) args.Result;
foreach (var response in photoResponses)
{
allResponses[i++] = response;
}

};
photoWorker.RunWorkerAsync();


//Update main ProgressBar
mainWorker = new BackgroundWorker();
mainWorker.WorkerReportsProgress = true;
mainWorker.WorkerSupportsCancellation = true;

mainWorker.DoWork += delegate(object s, DoWorkEventArgs args)
{
mainWorker.ReportProgress(10);
if (mainWorker.CancellationPending)
{
args.Cancel = true;
return;
}
mainWorker.ReportProgress(50);

//mainWorker doing its work
if (!allResponses.Contains(false))
{
bool IsDone = true;
string finalResponseFromServer = ServiceRequest.GetFinalResponse("SubmitChanges", "ServiceInstances", IsDone.ToString(), serviceInstance.ServiceInstanceID.ToString(), allPhotosToUpload.Count.ToString(), signatures.Count().ToString());
var finalResponse = finalResponseFromServer.Deserialize>();
finalSuccessMessage = (bool)finalResponse["success"];
args.Result = finalSuccessMessage;
if (finalSuccessMessage)
{
mainWorker.ReportProgress(100);
}
}
};
mainWorker.ProgressChanged += delegate(object s, ProgressChangedEventArgs args)
{
mainProgressBar.Value = args.ProgressPercentage;
};
mainWorker.RunWorkerCompleted += delegate(object s, RunWorkerCompletedEventArgs args)
{
btnClose.IsEnabled = true;

};
mainWorker.RunWorkerAsync();


}
}




I am getting AccessViolation exception, and the array allResponses is not modified at all.
I know the result of DoWork event can be accessed in RunCompleted event, then why allResponses array is not modifying.

Thanks for reading I know the code block is too long.