|
Hi
Does anyone know how to dispose backgroundworker completely and release all the system resources associated with it?
I called cancelAsync and then backgroundworker.Dispose(), even then it shows backgroundworker.IsBusy = true.
Please help
Vsaratkar
|
|
|
|
|
Just because it shows IsBusy = true, why do you think it's using resources ? What resources do you expect it could be using ( answer, close to none, unless it uses something explicit, like Bitmaps, which you should have cleaned up explicitly yourself )
Christian Graus
Driven to the arms of OSX by Vista.
Read my blog to find out how I've worked around bugs in Microsoft tools and frameworks.
|
|
|
|
|
Calling CancelAsync just sets CancellationPending - it's up to you to check this property at apropriate places in your DoWork handler, and if it's set - set e.Cancel and return from the handler. Then, and only then will RunWorkerCompleted be called and the background thread terminated.
[Edit] Here's the source[^] that shows BackgroundWorker is implemented [/Edit]
|
|
|
|
|
Thanks Christian and DaveyM69 for your prompt replies.
I will explain my application in brief.
Actaully we are uploading 3 different types of data to the web Server using Webrequest and Webresponse classes.
First type of data are values which uploads at once, second is very small binary file around 1kb and third type of data is photo which takes around 50 seconds for one photo to upload. Our application is taking multiple photos.
I want to show 3 individual progress bars for 3 uploads and one main bar for all 3 types of data upload.
I have created a class "UPloader" with events to manage the progress bars by passing variables to UI and instantiate that class in UI window.
I am using background worker in "UPloader" class to make 4 requests and get responses because I want to give user the facility to cancel the upload. Backgroundworker is a public variable and in UI on cancel button click, I am calling Uploader.BackgroundWorker.cancelAsync.
I am using compact database to hold the data. When I say "cancel", it cancels the upload, but when I try to upload the data without logging out the application, then I get NullReference exception. But if I log in to the application, I could able to upload the data.
I was wondering is this a good approach, because I want to give user "cancel" functionality.
I am not sure if one backgroundworker can manage 3 different Webrequests and webresponses.
If you know any better way to implement this logic, please help.
If you want I can post my code tomorrow, I am off today.
Thanks for reading,
Veena
|
|
|
|
|
Personally, I would use three background workers here, one for each upload type and wrap them all in one 'super' background worker class that exposes the required events and methods.
This is a very rough mock up with a lot of gaps to fill but the theory should be OK.
public class Uploader
{
public event EventHandler<EventArgs<UploadProgress>> ProgressChanged;
public event EventHandler<EventArgs<RunWorkerCompletedEventArgs[]>> Completed;
private BackgroundWorker backGroundWorkerData;
private BackgroundWorker backGroundWorkerFile;
private BackgroundWorker backGroundWorkerPhoto;
private RunWorkerCompletedEventArgs[] result;
public void RunAsync()
{
result = new RunWorkerCompletedEventArgs[3];
backGroundWorkerData = new BackgroundWorker();
backGroundWorkerData.WorkerReportsProgress = true;
backGroundWorkerData.WorkerSupportsCancellation = true;
backGroundWorkerData.DoWork += new DoWorkEventHandler(backGroundWorkerData_DoWork);
backGroundWorkerData.ProgressChanged += new ProgressChangedEventHandler(backGroundWorkerData_ProgressChanged);
backGroundWorkerData.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backGroundWorkerData_RunWorkerCompleted);
backGroundWorkerData.RunWorkerAsync();
}
void backGroundWorkerData_DoWork(object sender, DoWorkEventArgs e)
{
}
void backGroundWorkerData_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
OnProgressChanged(
new EventArgs<UploadProgress>(
new UploadProgress(DataType.Data, e.ProgressPercentage)));
}
void backGroundWorkerData_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
result[0] = e;
backGroundWorkerData = null;
CheckCompleted();
}
public void CancelAsync()
{
backGroundWorkerData.CancelAsync();
backGroundWorkerFile.CancelAsync();
backGroundWorkerPhoto.CancelAsync();
}
private void CheckCompleted()
{
if (backGroundWorkerData == null &&
backGroundWorkerFile == null &&
backGroundWorkerPhoto == null)
OnCompleted(new EventArgs<RunWorkerCompletedEventArgs[]>(result));
}
protected virtual void OnProgressChanged(EventArgs<UploadProgress> e)
{
EventHandler<EventArgs<UploadProgress>> eh = ProgressChanged;
if (eh != null)
eh(this, e);
}
protected virtual void OnCompleted(EventArgs<RunWorkerCompletedEventArgs[]> e)
{
EventHandler<EventArgs<RunWorkerCompletedEventArgs[]>> eh = Completed;
if (eh != null)
eh(this, e);
}
}
public class UploadProgress
{
public UploadProgress(DataType dataType, int progress)
{
DataType = dataType;
Progress = progress;
}
public DataType DataType { get; private set; }
public int Progress { get; private set; }
}
public enum DataType
{
Data = 0,
File = 1,
Photo = 2
}
public class EventArgs<T> : EventArgs
{
public EventArgs(T value)
{
Value = value;
}
public T Value { get; private set; }
}
|
|
|
|
|
Thanks Dave for all your time and interest.
I will implement the logic and let you know.
Thanks a lot!!!
Veena
|
|
|
|
|
Hi Dave,
I am using only one backgroundworker since I have to upload 3 types of data in sequence , get the confirmation from the web server in loop i. e. for each service Instance. So background worker was uploading the 3 type of data in sequence in foreach loop.
I checked the MainWorker.CancellationPending property before each webrequest. The most time cosuming was photo upload, so I checked MainWorker.CancellationPending between Webrequest and Webresponse. I called RunworkerCompleted right after DoWork and
write these lines
if(eventArgs.Cancelled)
{
MainWorker = null;
}
Now everything works as expected, backgroundworker gets disposed properly and I can upload the data anytime, without exiting and logging in to the application again,
Thanks for all your help,
Veena
|
|
|
|
|
No problem, glad to help.
I thought you were uploading all three simultaneously which is why I suggested thre workers. If it's sequential then just the one is the correct approach
|
|
|
|
|
Description:
EventType clr20r3, P1 controllerservice.exe, P2 1.0.0.0, P3 4a80352d, P4 mscorlib, P5 2.0.0.0, P6 492b834a, P7 1807, P8 24, P9 system.invalidoperationexception, P10 NIL.
Am getting this error while running my c# application. The application sometimes runs with no errors and sometimes it crashes due to this error. Dont know the reason, can anyone help.
Thanks
Prasanna
|
|
|
|
|
First google hit[^]
Christian Graus
Driven to the arms of OSX by Vista.
Read my blog to find out how I've worked around bugs in Microsoft tools and frameworks.
|
|
|
|
|
my question is that if i want a polygon how to draw a polygon from graphics Point of view in C#.plz give me hintshow can i draw a polygon using grapihcs in C# i m new in Graphics so i want it to be start from a basic level.
|
|
|
|
|
|
hey all
I have this Media Player project
it has albumes' form.
it supposed to add a new song to XML file. but it does not.
here is the source code :
http://rapidshare.com/files/289445150/Homa.rar.html[^]
When download the file and extract , enter form albumes
choose an album from the combobox (e.g album1)
click on "Add" button
select media file.
it does not add it to XML file.
Project was coded in Visual C# 2008
thanks.
modified on Tuesday, October 6, 2009 1:25 PM
|
|
|
|
|
Do you honestly expect people to download your entire project and debug it for you?
|
|
|
|
|
I do.
i do believe that this forum has been made to ask/answer questions.
and was not made for complaining and blaming each others.
better to say nothing than say something not in the right place.
from my experience of life and coding.
people/coders prefer to see code live.
it does not work if i write down the function here because it's related to another functions.
second i was seeking all the day for free-uploading website to upload a screen-shot which explains the situation of the error easily.
third, do I have to reply to your question?
|
|
|
|
|
I suggest you take a look at the guidelines[^] for asking questions here, specifically points 7, furthermore posting an entire project for download is generally a no-no here.
eawedat wrote: do believe that this forum has been made to ask/answer questions.
and was not made for complaining and blaming each others.
No one complained or blamed you, or anyone else for that fact. I was trying to help you construct your question in a proper manner (albeit through sarcasm) in hopes you would realize that only specific blocks of functions or code can be really helped with, as asking for an entire audit on your entire project is simply rediculous and absurd in itself, as this would be a paying job.
eawedat wrote: second i was seeking all the day for free-uploading website to upload a screen-shot which explains the situation of the error easily.
imageshack[^] is your best bet, and Google [^]found that for me in about under 1 second.
eawedat wrote: third, do u have to reply to your question?
Yes I do, unfortunately it was the wrong one. In short; don't post your entire project and ask people to debug the entire thing for you while you do nothing to help yourself, including following common sense around these boards. It's rude.
|
|
|
|
|
I'm not going to argue with you, because there are many lessons of philosophy that can be taught
and here is not the right place to.
with a respect
here is the line which is underlined/highlighted
XmlNode albumend = doc.CreateElement(albumname);
hope u can get the idea from one line
thats was the point in my posting the whole project.
codes are not separated. they are mostly one unit specifically in my project.
with you say
"don't post your entire project and ask people to debug the entire thing for you while you do nothing to help yourself"
what am doing here? do u think am wasting my time registering/posting replies and questions in here to do nothing ?
i was not here if was not in need of help!
my posting the whole project came to ease more to helpers like you
and downloading method is just about one click
thanks again.
|
|
|
|
|
|
OK, you have a backslash in the text of the element you're trying to add. This is, obviously, not allowed, so you have to escape the illegal character before you try to add it to the Xml document.
|
|
|
|
|
thank you very much
here am trying to fix it,
trying to figure out how to rebuild-restate the string albumname to espace "\"
|
|
|
|
|
|
eawedat wrote: http://img251.imageshack.us/img251/3733/err2.gif[^]
So the message which explained what was wrong did not tell you what was wrong ???
|
|
|
|
|
eawedat wrote: i do believe that this forum has been made to ask/answer questions.
Yes, when people do their own work to the point of posting a code snippet and saying 'this is what I expect, this is what I see in the debugger, and i don't understand how to get the result I want', we are glad to help. When someone posts an entire project and says 'I have no idea what I'm doing', that's a hell of a long shot.
Christian Graus
Driven to the arms of OSX by Vista.
Read my blog to find out how I've worked around bugs in Microsoft tools and frameworks.
|
|
|
|
|
|
another philosopher has visited us
I could use javascript to add a counter ,
to let us see how many visitors are interested in this subject
anyone else? (i like hearing these words while playing Unreal Tournament)
by the way i liked the formal word "hell"
keep going with nice words
where am i ?
I got the answer already by a good guy in here,
Discussion has been closed.
NO more comments please.
lol
|
|
|
|